2

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

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

还有其他解释吗?这个想法突然出现在我的脑海中,即 1 索引是正则表达式内部更深层次的东西(比如固有地占据零位的东西)或沿着这些线的东西的结果。也就是说,我无法找到有关此特定怪癖的任何文档。是否有任何正则表达式大师知道这里发生了更深层次的事情,或者它只是严重遗留代码中的一些东西?

4

1 回答 1

4

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

我猜,你指的其他语言是数组和其他容器类型。好吧,在正则表达式中,捕获组确实以 开头0,但一开始并不明显。

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

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

ab(\d+)cd

确实有两组:

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

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

因此,对于以下正则表达式(添加了空格以提高可读性):

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

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

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

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

于 2013-07-22T15:42:12.450 回答