Java Regex:可选匹配

时间:2015-09-10 02:41:56

标签: java regex

我一直在使用以下Regex从一堆文本中提取邮政编码:

    "\\d{5}\\-?[1-9]?[1-9]?[1-9]?[1-9]?"

我打算使用最后4 [1-9]可选(使用?)是为了能够提取5位邮政编码和5位邮政编码+ 4,例如11001-1010。

但是,它只匹配最后四个数字的前两位数字,即使我最后输了4位数字。

例如,在邮政编码11001-1010中,它将匹配11001-10。

任何人都知道为什么?

3 个答案:

答案 0 :(得分:1)

您可以使用4,以便在-之后将\\d{5}(\\-\\d{0,4})?-位数相匹配。

修改

  

来自评论:但是 - 不会是可选的。

为此,您可以使用print "\\" 制作\组和破折号后的数字。

答案 1 :(得分:1)

它停在后缀的前0位,     " \ d {5} \ - [1-9] [1-9] [1-9] [1-9]&#34?????; 所以在你的例子中,它只匹配到11001-1 是" \ d {5} \ - ?[0-9]?[0-9]?[0-9]?[0-9]?"工作好吗? 其他答案可能更清晰,但那就是错误。

根据this

看起来不错

答案 2 :(得分:1)

简单回答问题:对于邮政编码11001-1010,您的正则表达式只会匹配11001-1,因为-后面的可选4位数字不能是0

对于如何修复它的未说明的问题,这取决于你是否只想匹配一个可选的+4,或者你想要匹配+ 3,+ 2,+ 1和+0,就像你的表达式一样

将Zip5与可选的+4匹配,例如匹配11001-101011001

"\\d{5}(?:-\\d{4})?"

将Zip5与可选的+ N匹配,例如匹配11001-101011001-10111001-1011001-111001-11001

"\\d{5}(?:-\\d{0,4})?"

<强>更新

现在,如果您想确保它与56789-1234123456789-123456789的{​​{1}}不匹配,您可以添加字边界检查:

abcd56789-1234qwerty