正则表达式是-?([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
选择要求与整个字符串进行匹配;默认情况下它匹配字符串中的任何位置。其他的,如sed
、awk
和 Perl 会很乐意在字符串中的任何位置查找模式。使用^
和$
修饰符(“锚点”)将模式强制到字符串的开头或结尾(分别)。
所以,你想要的 ERE 模式可能是这样的:
^-?[1-9]?[0-9]$