【问题标题】:Why are regex capturing groups indexed at one?为什么正则表达式捕获组索引为一个?
【发布时间】:2013-07-22 23:47:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: regex indexing


    【解决方案1】:

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

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

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

    所以,在下面的正则表达式中,对于字符串 - "ab123cd":

    ab(\d+)cd
    

    实际上有两组:

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

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

    所以,对于下面的正则表达式(增加了可读性的空格):

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

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

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

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

    【讨论】:

    • 哦,这更有意义!非常感谢您的解释!
    • 啊,抱歉 Rohit,我出去吃午饭了,就在那 10 分钟的宽限期内。
    • @SlaterTyranus。没问题:)
    猜你喜欢
    • 2013-05-07
    • 2016-06-04
    • 2021-12-31
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多