我的一部分担心这个问题会被关闭,但我真的被某些东西困惑了。在我使用的每种语言的正则表达式中,捕获组都被索引为一,即使语言的其余部分索引为零。我想到了可以导致1-indexing的设计决策,这通常是为了降低非技术人员进入的门槛,但是当谈到正则表达时,这已经是地狱般的和不可理解的,这个论点似乎并不真正持。
此外,由于每种语言似乎都对正则表达式进行了自己的小调整,因此将捕获组索引与语言的其余部分保持一致似乎是明智的。
还有其他解释吗?这个想法突然出现在我的脑海中,1索引是由于正则表达式的腹部内部更深层的东西(就像固有地占据零点的东西)或沿着这些线条的东西。也就是说,我无法找到关于这个特殊怪癖的任何文档。是否有任何正则表达式大师知道这里有更深层次的东西,或者它只是严重遗留代码中的东西?
答案 0 :(得分:3)
在我使用的每种语言的正则表达式中,捕获组都是 索引为1,即使语言的其余部分索引为零。
我想,你所说的其余语言,数组和其他容器类型。好吧,在正则表达式中,捕获组确实以0
开头,但最初并不明显。
捕获组0 ,包含完整匹配,其上的捕获组是您可以看到使用括号创建的组 - ()
。
因此,在下面的正则表达式中,对于字符串 - "ab123cd"
:
ab(\d+)cd
实际上有两组:
ab123cd
()
- 123
在那里,组按左括号 (
的出现顺序编号。
因此,对于以下正则表达式(增加可读性的空白):
ab( x (\d+))cd
^ ^
| |
group 1 group 2
将上述正则表达式应用于字符串 - "abx123cd"
时,您将拥有以下组:
abcx123cd
x123
123
在Java
中映射这些正则表达式时,您可以使用以下方法获取所有这些组:
Matcher.group()
获取组0(注意,没有参数)和Matcher.group(int)
以获取其他组(请注意int
参数,为各个组获取值)