为什么正则表达式捕获组索引为一个?

时间:2013-07-22 15:32:58

标签: regex indexing

我的一部分担心这个问题会被关闭,但我真的被某些东西困惑了。在我使用的每种语言的正则表达式中,捕获组都被索引为一,即使语言的其余部分索引为零。我想到了可以导致1-indexing的设计决策,这通常是为了降低非技术人员进入的门槛,但是当谈到正则表达时,这已经是地狱般的和不可理解的,这个论点似乎并不真正持。

此外,由于每种语言似乎都对正则表达式进行了自己的小调整,因此将捕获组索引与语言的其余部分保持一致似乎是明智的。

还有其他解释吗?这个想法突然出现在我的脑海中,1索引是由于正则表达式的腹部内部更深层的东西(就像固有地占据零点的东西)或沿着这些线条的东西。也就是说,我无法找到关于这个特殊怪癖的任何文档。是否有任何正则表达式大师知道这里有更深层次的东西,或者它只是严重遗留代码中的东西?

1 个答案:

答案 0 :(得分:3)

  

在我使用的每种语言的正则表达式中,捕获组都是   索引为1,即使语言的其余部分索引为零。

我想,你所说的其余语言,数组和其他容器类型。好吧,在正则表达式中,捕获组确实以0开头,但最初并不明显。

捕获组0 ,包含完整匹配,其上的捕获组是您可以看到使用括号创建的组 - ()

因此,在下面的正则表达式中,对于字符串 - "ab123cd"

ab(\d+)cd

实际上有两组:

  • 第0组 - 完全匹配 - ab123cd
  • 第1组 - 您使用() - 123
  • 捕获的群组

在那里,组按左括号 ( 的出现顺序编号。

因此,对于以下正则表达式(增加可读性的空白):

ab(    x   (\d+))cd
  ^        ^
  |        |
 group 1  group 2

将上述正则表达式应用于字符串 - "abx123cd"时,您将拥有以下组:

  • 第0组 - 完全匹配 - abcx123cd
  • 第1组 - 第一个左括号中的模式 - x123
  • 第2组 - 第二个左括号中的模式 - 123

Java中映射这些正则表达式时,您可以使用以下方法获取所有这些组: