我试图找出一个匹配任何9位数的正则表达式,但最后4位数不能是9999或0000.例如,我希望正则表达式匹配这些:
但不是这些:
我尝试过负面的预测。但它似乎不符合我的要求。
我能得到的最接近的是\d{5}[^\D90]{4}
,但是最后4位数根本不能是0或9,这不是我想要的。
这是一项特殊的邮政编码要求。任何帮助将不胜感激!
答案 0 :(得分:4)
在第5位后使用负向前瞻:
^[0-9]{5}(?!0000|9999)[0-9]{4}$
或最后的观察:
^[0-9]{9}$(?<!0000|9999)
(如果你的正则表达式味道不允许带有替换的lookbehind,请使用两个lookbehinds:
^[0-9]{9}$(?<!0000)(?<!9999)
答案 1 :(得分:3)
您的\d{5}[^\D90]{4}
正则表达式匹配任意5个数字,后跟除非数字9
和0
以外的4个字符。
您可以使用
^(?!\d*(?:9999|0000)$)\d{9}$
较短的变体:^(?!\d*(?:9{4}|0{4})$)\d{9}$
。请参阅regex demo
如果输入包含一些数字并以9999
或0000
结尾,那么否定前瞻(锚定在开头)将使匹配失败。
如果我们继续优化正则表达式,最有效的版本(基于Casimir suggests in his answer)是:
^\d{5}(?!9{4}|0{4})\d{4}$
请参阅regex demo
在这里,
^
- 字符串的开头\d{5}
- 正好5位数(?!9{4}|0{4})
- 检查(但不匹配,索引保持在第5位以后,因为它是零宽度断言),如果恰好有4 9
s或0
,并且如果发现,匹配失败(因为(?!...)
是否定前瞻)\d{4}
- 正好4位数$
- 字符串结束。