java - 正则表达式 - 从 JAVA 中的字符串句子中匹配邮政编码
问题描述
我无法理解 JAVA 中的正则表达式。我正在尝试从列表中获取邮政编码。我在下面设置了我的正则表达式。
\b([0-9]{5})(?:-[0-9]{4})?\b
列表示例:
22193
22192-2222
.22193
hello this is .221938
hello this is .22012
hello this is 22193
22193 hello
221931
22193.2222
当我使用 .matcher(string) 并循环上面的列表时,我在下面收到了这个结果。
22193 -----MATCH
22192-2222------MATCH
.22193-----MATCH
hello this is .221938
hello this is .22012 ----MATCH
hello this is 22193---- MATCH
22193 hello -----MATCH
221931
22193.2222 ---- MATCH
问题在于它与前后有小数的数字匹配。(与 \、$、% 等特殊字符相同)。我想要这个结果
22193 ---------MATCH
22192-2222 ------MATCH
.22193
hello this is .221938
hello this is .22012
hello this is 22193 -----MATCH
22193 hello ---- MATCH
221931
22193.2222
如何匹配在邮政编码之间和之前/之后没有特殊字符的字符串?请问你能坚持吗?我试图在 regextester.com 上玩它,但没有运气。有什么建议么?
解决方案
也许你可以做的是以下几点:
((?<=\s|^)\d{5}(?=\s|$|-\d{4}(?=\s|$)))(?:-\d{4}(?=\s|$))?
查看在线演示
(
- 开始第一个捕获组。(?<=\s|^)
- 空格字符或起始字符串 ancor 的正向后视。\d{5}
- 准确匹配 0-9 范围内的五位数字。(?=\s|$|-\d{4}(?=\s|$))
- 匹配空格字符或结束字符串 ancor或连字符的正前瞻,后跟正好四个 0-9 范围内的数字,嵌套正前瞻以检查空格字符或结束字符串 ancor。
)
- 关闭捕获组 1。(?:
- 启动非捕获组-\d{4}
- 匹配一个连字符,后跟恰好是 0-9 的四位数字。(?=\s|$)
- 对空格字符或结束字符串 ancor 的积极前瞻。
)?
- 关闭非捕获组并使其成为可选。
推荐阅读
- hibernate - JPQL Quesry in ManyToMany relation using JoinTable
- c# - 在负载均衡器服务器上获取 WebExceptions 标头
- spring-mvc - 如何使用 Spring MVC @RequestParam 解析不同的 ISO 日期/时间格式
- c# - 使用 using 语句正确处理 StreamWriter
- ruby-on-rails-3 - Rails 3:我有控制器名称和操作,需要为其获取路径和 http 动词
- apache-spark - 删除正在运行的 Spark JOB 的 Hive 暂存目录
- android - 如何从联系人列表中获取“ME”(所有者配置文件)配置文件数据?
- python - 使用 Python 从大型文本文件中提取数据
- javascript - Angular 5中类型复选框的动态输入
- r - R Xgboost 验证错误作为停止指标