实施例:
01 = match
10 = match
99 = match
00 = no match
到目前为止,我有这个:/^ [1-9][0-9] | [0-9][1-9] $/
但我觉得可以优化它。
答案 0 :(得分:6)
您可以使用否定前瞻来限制通用[0-9]{2}
模式:
^(?!00)[0-9]{2}$
请参阅regex demo
[0-9]{2}
将完全匹配2位数。 (?!00)
negative lookahead将在字符串的开头执行一次,并确保在字符串结束之前没有00
。如果字符串等于00
,则不会找到匹配项。
请参阅How Negative Lookahead Works。
详细的模式说明:
^
- 字符串开头(?!00)
- 如果在当前位置之后有两个0
s(在字符串的开头),则会导致匹配失败的负向前瞻。由于下一个子模式 - [0-9]{2}$
- 只允许字符串中有2个符号,因此我们不必在前瞻中添加任何锚点,在其他情况下,必须添加$
才能排除{ {1}}匹配。00
- 正好两个(感谢限制量词[0-9]{2}
)数字(在大多数情况下,{min(,max)?}
可以替换为[0-9]
,但\d
在一些风格中,也可以比常规的\d
更多匹配)[0123456789]
- 字符串结尾(取决于正则表达式的风格,$
可能更合适,因为它与字符串的结束匹配。)答案 1 :(得分:1)
试试这个RegEx:
(?!00)\d\d
这使用Negative Lookahead(此处为nice answer解释),(?! )
。这意味着内部存在的任何东西,都不匹配。在这种情况下,它将检测是否存在00
,如果存在则会失败。如果没有,请选择2位数(\d
是[0-9]
的简写)
更安全的版本:
^(?!00)\d\d$
这也使用^
,它指出数据必须位于字符串的开头(或带有m
标志的行),并且$
数据必须位于结束。因此,当您使用^ $
时,内部数据必须与整行/字符串匹配
以下是负面前瞻的一些例子:
# Using the RegEx (?!9)\d
1 # Match
2 # Match
5 # Match
9 # NO MATCH
# Using the RegEx (?!Tom)\w+
Tim # Match
Joe # Match
Bob # Match
Tom # NO MATCH
# Using the RegEx (?!Foo)\w+(?!Bar)
BarBazFoo # Match
BazBarFoo # Mtach
FooBarBaz # NO MATCH
BazFooBar # NO MATCH