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

Regex that matches any 9 digits except last 4 digits can't be 9999 or 0000

我正在尝试找出匹配任意 9 位数字的正则表达式,但最后 4 位数字不能是 9999 或 0000。例如,我希望正则表达式匹配这些:

但不是这些:

我试过否定前瞻。但是好像不符合我的要求

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

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

您的 \d{5}[^\D90]{4} 正则表达式匹配任意 5 个数字后跟 4 个非数字字符,90.

你可以使用

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

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

如果输入包含一些数字并以 99990000.

结尾,则否定前瞻(锚定在开始处)将使匹配失败

如果我们继续优化正则表达式,最有效的版本(基于)是:

^\d{5}(?!9{4}|0{4})\d{4}$

regex demo

这里,

  • ^ - 字符串的开头
  • \d{5} - 恰好 5 位数
  • (?!9{4}|0{4}) - 检查(但不匹配,索引保留在第 5 个数字之后,因为它是零宽度断言)是否恰好有 4 个 90,如果找到,则匹配失败(因为 (?!...) 负先行
  • \d{4} - 恰好 4 位数字
  • $ - 字符串结尾。

在第 5 位数字后使用负前瞻:

^[0-9]{5}(?!0000|9999)[0-9]{4}$

或最后回顾一下:

^[0-9]{9}$(?<!0000|9999)

(如果您的正则表达式风格不允许通过交替进行后视,请使用两个后视:

^[0-9]{9}$(?<!0000)(?<!9999)