匹配除最后 4 位以外的任意 9 位数字的正则表达式不能是 9999 或 0000
Regex that matches any 9 digits except last 4 digits can't be 9999 or 0000
我正在尝试找出匹配任意 9 位数字的正则表达式,但最后 4 位数字不能是 9999 或 0000。例如,我希望正则表达式匹配这些:
- 123456789
- 123459991
- 123459990
但不是这些:
- 123450000
- 123459999
我试过否定前瞻。但是好像不符合我的要求
我能得到的最接近的是 \d{5}[^\D90]{4}
,但是最后 4 位数字根本不能是 0 或 9,这不是我想要的。
这是一个特殊的邮政编码要求。任何帮助将不胜感激!
您的 \d{5}[^\D90]{4}
正则表达式匹配任意 5 个数字后跟 4 个非数字字符,9
和 0
.
你可以使用
^(?!\d*(?:9999|0000)$)\d{9}$
更短的变体:^(?!\d*(?:9{4}|0{4})$)\d{9}$
。请参阅 regex demo
如果输入包含一些数字并以 9999
或 0000
.
结尾,则否定前瞻(锚定在开始处)将使匹配失败
如果我们继续优化正则表达式,最有效的版本(基于)是:
^\d{5}(?!9{4}|0{4})\d{4}$
这里,
^
- 字符串的开头
\d{5}
- 恰好 5 位数
(?!9{4}|0{4})
- 检查(但不匹配,索引保留在第 5 个数字之后,因为它是零宽度断言)是否恰好有 4 个 9
或 0
,如果找到,则匹配失败(因为 (?!...)
是 负先行 )
\d{4}
- 恰好 4 位数字
$
- 字符串结尾。
在第 5 位数字后使用负前瞻:
^[0-9]{5}(?!0000|9999)[0-9]{4}$
或最后回顾一下:
^[0-9]{9}$(?<!0000|9999)
(如果您的正则表达式风格不允许通过交替进行后视,请使用两个后视:
^[0-9]{9}$(?<!0000)(?<!9999)
我正在尝试找出匹配任意 9 位数字的正则表达式,但最后 4 位数字不能是 9999 或 0000。例如,我希望正则表达式匹配这些:
- 123456789
- 123459991
- 123459990
但不是这些:
- 123450000
- 123459999
我试过否定前瞻。但是好像不符合我的要求
我能得到的最接近的是 \d{5}[^\D90]{4}
,但是最后 4 位数字根本不能是 0 或 9,这不是我想要的。
这是一个特殊的邮政编码要求。任何帮助将不胜感激!
您的 \d{5}[^\D90]{4}
正则表达式匹配任意 5 个数字后跟 4 个非数字字符,9
和 0
.
你可以使用
^(?!\d*(?:9999|0000)$)\d{9}$
更短的变体:^(?!\d*(?:9{4}|0{4})$)\d{9}$
。请参阅 regex demo
如果输入包含一些数字并以 9999
或 0000
.
如果我们继续优化正则表达式,最有效的版本(基于
^\d{5}(?!9{4}|0{4})\d{4}$
这里,
^
- 字符串的开头\d{5}
- 恰好 5 位数(?!9{4}|0{4})
- 检查(但不匹配,索引保留在第 5 个数字之后,因为它是零宽度断言)是否恰好有 4 个9
或0
,如果找到,则匹配失败(因为(?!...)
是 负先行 )\d{4}
- 恰好 4 位数字$
- 字符串结尾。
在第 5 位数字后使用负前瞻:
^[0-9]{5}(?!0000|9999)[0-9]{4}$
或最后回顾一下:
^[0-9]{9}$(?<!0000|9999)
(如果您的正则表达式风格不允许通过交替进行后视,请使用两个后视:
^[0-9]{9}$(?<!0000)(?<!9999)