我一直在使用下面的Regex从一堆文本中提取邮政编码:
"\\d{5}\\-?[1-9]?[1-9]?[1-9]?[1-9]?"
我的意图是使最后的4-9可选(使用?)是能够提取5位邮政编码和5位邮政编码的+4如11001-1010。
然而,它只匹配前四个数字的前两个数字,即使我在末尾放了4个数字。
例如,在邮政编码11001-1010中,它将匹配11001-10。
有人知道为什么吗?
发布于 2015-09-10 03:06:53
问题的简单回答:对于邮政编码11001-1010
,您的正则表达式只能与11001-1
匹配,因为-
后面的可选4位数不能是0
。
至于如何解决这个问题,这取决于您是只想匹配一个可选的+4,还是像您的表达式那样也要匹配+3、+2、+1和+0。
将Zip5与可选+4相匹配,例如匹配11001-1010
和11001
"\\d{5}(?:-\\d{4})?"
将Zip5与可选+N相匹配,例如匹配11001-1010
、11001-101
、11001-10
、11001-1
、11001-
和11001
"\\d{5}(?:-\\d{0,4})?"
更新
现在,如果您想确保它与56789-1234
of 123456789-123456789
或abcd56789-1234qwerty
不匹配,可以添加一个字边界检查:
"\\b\\d{5}(?:-\\d{4})?\\b"
发布于 2015-09-10 02:44:42
您可以使用\\d{5}\\-\\d{0,4}
,它允许您在-
之后将0
与4
数字匹配。
编辑
从评论中说:但那样的话-就不是可选的了。
为此,您可以使用\\d{5}(\\-\\d{0,4})?
使-
组和数字后的破折号可选。
发布于 2015-09-10 03:06:16
它在后缀的前0处停止,“d{5}-1-91-91-91-9?”因此,在您的示例中,它只匹配11001-1,"\d{5}-0-90-90-90-9?“工作还好吗?其他的答案可能更清晰,但这就是问题所在。
每个这看起来都可以
https://stackoverflow.com/questions/32492245
复制相似问题