22

为什么匹配从 1 到 10 的数字的正则表达式通常写成如下?

[1-9]|10

代替:

[1-10]

或这个:

[1-(10)]
4

9 回答 9

30

有时一张价值1000字的好画...

以下是您问题中的三个命题以及正则表达式风格理解它们的方式:

[1-9]|10

正则表达式图片

[1-10]

正则表达式图片

[1-(10)]

Invalid regexp !!

这个正则表达式是无效的,因为一个范围是1-用一个数字打开的( ),但不是用另一个数字封闭的(以 结尾()。

范围通常用两边的数字或两边的字母来绑定。

使用Debuggex生成的图像

于 2013-06-28T09:05:19.073 回答
19

那是因为正则表达式适用于字符,而不适用于数字。[1-9]相当于(?:1|2|3|4|5|6|7|8|9)while [1-10]will be (?:1|0)(因为它是范围 1-1 和数字 0)。

简单地说,字符类中的范围总是指连续的字符范围,不管它们看起来如何。即使它们是数字,也不意味着存在任何类型的数字范围。

于 2013-06-27T10:51:09.493 回答
8
[1-9]|10

在这:

  • [1-9]接受从 1 到 9 的任何字符;
  • |执行“或”操作;
  • 10从字面上接受 10。

[1-10]

这接受:

  • 1 到 1 之间的任何单个字符,
  • 0
于 2013-06-27T10:53:25.883 回答
3

不管里面是什么模式[...](字符类),它只匹配一个字符

字符类中的范围运算符 ( -) 的工作方式是将单个字符作为左操作数,将单个字符作为右操作数,然后将其展开为字符列表。

所以,看看你的例子中的范围

  • 1-9(1 到 9) in [1-9]|10(等价于[123456789]|10)
  • 1-1(1 to 1) in [1-10](等价于[10]与 相同[01])
  • 1-((1 到左括号)在[1-(10)]
    • 实际上,我在 Perl 中遇到了一个错误,因为范围1to(并没有真正的意义。
于 2013-06-27T13:25:24.263 回答
0

这是关于字符匹配的。当您说它[1-9]意味着它匹配从 1 到 9 的任何单个字符时。数字 10 将被视为 2 个单独的字符。

于 2013-06-27T10:51:08.797 回答
0

这是因为[]符号代表字符集,例如[0-5]匹配器 0-5。但是,10 有两个数字,因此[0-9]不会产生完全匹配(只会匹配第一个数字,“10”的“1”。

管道符号|可以看作是“或”运算符。

于 2013-06-27T10:51:17.983 回答
0

这就是字符类的基本定义。[1-10]表示“匹配 1 到 1 或 0 范围内的任何字符”。字符类逐个字符进行评估(转义序列和 除外-);他们不懂数字。

于 2013-06-27T10:51:19.880 回答
0

表示[]单个字符匹配

例如[ab]将匹配ab

所以[1-9]这实际上是一个简写,[123456789]它将匹配一个单个字符,该字符是从1到的数字之一9

您的示例[1-10]将扩展 1-1 以表示范围内的所有字符1( 1ie 1),因此实际的正则表达式将扩展为 [10] (即字符 1 或字符 0)

于 2013-06-27T10:54:19.343 回答
-3
\[([1-9][0-9]|[0-9])\]

当您为项目复制某些内容时,这将删除 Wikipedia 的引用。

于 2018-05-12T14:27:17.367 回答