我的一部分担心这个问题会被结束,但我确实对某些事情感到困惑。在我使用的每种语言的正则表达式中,捕获组的索引为 1,即使该语言的其余部分索引为 0。我想到了会导致 1 索引的设计决策,这通常是为了降低非技术人员的进入门槛,但是当涉及到正则表达式时,它已经是地狱般且难以理解的,这个论点似乎并不真正成立。抓住。
此外,由于每种语言似乎对正则表达式都有自己的小调整,因此让捕获组索引与语言的其余部分保持一致似乎是明智的。
还有其他解释吗?我的脑海中突然浮现出这样的想法:1 索引是正则表达式内部更深层次的东西(比如本质上占据零位的东西)或类似的东西的结果。也就是说,我无法找到有关此特定怪癖的任何文档。是否有任何正则表达式大师知道这里发生了更深层次的事情,或者这只是严重遗留代码中的事情?
在我使用的每种语言的正则表达式中,捕获组的索引为 1,即使该语言的其余部分索引为 0。
我想,您所说的其余语言是指数组和其他容器类型。嗯,在正则表达式中,捕获组确实以 开头0,但一开始并不明显。
捕获组 0包含完整的匹配项,其上的捕获组是您可以看到使用括号 - 创建的组()。
因此,在下面的正则表达式中,对于字符串 - "ab123cd":
ab(\d+)cd
Run Code Online (Sandbox Code Playgroud)
实际上有两个组:
ab123cd()-123此后,组按照左括号 (出现的顺序进行编号。
因此,对于以下正则表达式(添加空格以提高可读性):
ab( x (\d+))cd
^ ^
| |
group 1 group 2
Run Code Online (Sandbox Code Playgroud)
将上述正则表达式应用于字符串 - 时"abx123cd",您将拥有以下组:
abcx123cdx123123当您将这些正则表达式映射到 中时Java,您可以使用以下方法获取所有这些组:
Matcher.group()获取组 0(注意,没有参数),并且Matcher.group(int)获取其余组(注意一个int参数,为各个组获取值)