为什么这个数字与这个正则表达式匹配?

为什么这个数字与这个正则表达式匹配?

正则表达式是-?([0-9]|([1-9][0-9])).

该号码-2231正在匹配。根据我的理解,应该是个位数或者两位数。为什么这个数字与这个正则表达式匹配?

答案1

正则表达式没有锚定,因此可以自由匹配前 1 个或两个数字并“成功”,而使后面的数字(成功)不匹配。

如果您需要 1 或 2 位数字,请锚定正则表达式:

'^-?([0-9]|([1-9][0-9]))$'

一些例子:

$ seq -100 -99 | grep -E '^-?([0-9]|[1-9][0-9])$'
-99

$ seq 99 100 | grep -E '^-?([0-9]|[1-9][0-9])$'
99

$ seq -9 9  | grep -E '^-?([0-9]|[1-9][0-9])$'
-9
-8
-7
-6
-5
-4
-3
-2
-1
0
1
2
3
4
5
6
7
8
9

$ seq -2231 -100 | grep -E '^-?([0-9]|[1-9][0-9])$'
(empty)

答案2

大多数使用正则表达式模式的程序实际上都实现了搜索模式的,而不是完整的字符串匹配。 Python 具有独特的search()match()方法 wheresearch()匹配字符串中的任何位置,并且match()仅在开头。grep可以-x选择要求与整个字符串进行匹配;默认情况下它匹配字符串中的任何位置。其他的,如sedawk和 Perl 会很乐意在字符串中的任何位置查找模式。使用^$修饰符(“锚点”)将模式强制到字符串的开头或结尾(分别)。

所以,你想要的 ERE 模式可能是这样的:

^-?[1-9]?[0-9]$

相关内容