匹配除最后4位数之外的任何9位数的正则表达式不能是9999或0000

时间:2016-02-12 23:00:21

标签: regex zip

我试图找出一个匹配任何9位数的正则表达式,但最后4位数不能是9999或0000.例如,我希望正则表达式匹配这些:

  • 123456789
  • 123459991
  • 123459990

但不是这些:

  • 123450000
  • 123459999

我尝试过负面的预测。但它似乎不符合我的要求。

我能得到的最接近的是\d{5}[^\D90]{4},但是最后4位数根本不能是0或9,这不是我想要的。

这是一项特殊的邮政编码要求。任何帮助将不胜感激!

2 个答案:

答案 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个数字,后跟除非数字90以外的4个字符。

您可以使用

^(?!\d*(?:9999|0000)$)\d{9}$

较短的变体:^(?!\d*(?:9{4}|0{4})$)\d{9}$。请参阅regex demo

如果输入包含一些数字并以99990000结尾,那么否定前瞻(锚定在开头)将使匹配失败。

如果我们继续优化正则表达式,最有效的版本(基于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位数
  • $ - 字符串结束。