首页 > 解决方案 > 正则表达式 - 从 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 上玩它,但没有运气。有什么建议么?

标签: javaregex

解决方案


也许你可以做的是以下几点:

((?<=\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 的积极前瞻。
  • )?- 关闭非捕获组并使其成为可选。

在此处输入图像描述


推荐阅读