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

标签 regex indexing

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

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

还有其他解释吗?我突然想到 1 索引是正则表达式内部更深层次的东西(比如固有地占据零点的东西)或沿着这些线的东西的结果。也就是说,我找不到关于这个特殊问题的任何文档。是否有任何正则表达式大师知道这里发生的更深层次的事情,或者它只是严重遗留代码中的某些事情?

最佳答案

In every language's regex that I've used, the capturing groups are indexed at one, even when the rest of the language is indexed at zero.

我想,在其他语言中,您指的是数组和其他容器类型。那么,在正则表达式中,捕获组确实以 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 中映射这些正则表达式时,您可以使用以下方法获取所有这些组:

关于regex - 为什么正则表达式捕获组索引为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17791639/

相关文章:

mysql - 如何为此查询创建索引并使其获得更好的性能?

javascript - 使用正则表达式获取字符串的第一个对应项

javascript - 按正则表达式分割

java - 用于过滤具有多个关键字的某些 URL 的正则表达式

java - 如何从solr/data/index读取数据

python - 切片多索引时间(第一级)TypeError : '<' not supported between instances of 'int' and 'slice'

ruby - 匹配子串但不匹配异常子串

r - 以任意顺序提取 2 个单词

MySQL 索引键

c# - 书籍索引的序列和 Rangify 列表