为什么匹配从 1 到 10 的数字的正则表达式通常写成如下?
[1-9]|10
代替:
[1-10]
或这个:
[1-(10)]
有时一张价值1000字的好画...
以下是您问题中的三个命题以及正则表达式风格理解它们的方式:
Invalid regexp !!
这个正则表达式是无效的,因为一个范围是1-
用一个数字打开的( ),但不是用另一个数字封闭的(以 结尾(
)。
范围通常用两边的数字或两边的字母来绑定。
使用Debuggex生成的图像
那是因为正则表达式适用于字符,而不适用于数字。[1-9]
相当于(?:1|2|3|4|5|6|7|8|9)
while [1-10]
will be (?:1|0)
(因为它是范围 1-1 和数字 0)。
简单地说,字符类中的范围总是指连续的字符范围,不管它们看起来如何。即使它们是数字,也不意味着存在任何类型的数字范围。
[1-9]|10
在这:
[1-9]
接受从 1 到 9 的任何字符;|
执行“或”操作;10
从字面上接受 10。[1-10]
这接受:
0
。不管里面是什么模式[...]
(字符类),它只匹配一个字符。
字符类中的范围运算符 ( -
) 的工作方式是将单个字符作为左操作数,将单个字符作为右操作数,然后将其展开为字符列表。
所以,看看你的例子中的范围
1-9
(1 到 9) in [1-9]|10
(等价于[123456789]|10
)1-1
(1 to 1) in [1-10]
(等价于[10]
与 相同[01]
)1-(
(1 到左括号)在[1-(10)]
1
to(
并没有真正的意义。这是关于字符匹配的。当您说它[1-9]
意味着它匹配从 1 到 9 的任何单个字符时。数字 10 将被视为 2 个单独的字符。
这是因为[]
符号代表字符集,例如[0-5]
匹配器 0-5。但是,10 有两个数字,因此[0-9]
不会产生完全匹配(只会匹配第一个数字,“10”的“1”。
管道符号|
可以看作是“或”运算符。
这就是字符类的基本定义。[1-10]
表示“匹配 1 到 1 或 0 范围内的任何字符”。字符类逐个字符进行评估(转义序列和 除外-
);他们不懂数字。
表示[]
单个字符匹配
例如[ab]
将匹配a
或b
所以[1-9]
这实际上是一个简写,[123456789]
它将匹配一个单个字符,该字符是从1
到的数字之一9
您的示例[1-10]
将扩展 1-1 以表示范围内的所有字符1
( 1
ie 1
),因此实际的正则表达式将扩展为 [10] (即字符 1 或字符 0)
\[([1-9][0-9]|[0-9])\]
当您为项目复制某些内容时,这将删除 Wikipedia 的引用。