理解捕获组和反向引用有困难

13

我希望整理一下我的正则表达式知识,所以决定翻阅一本关于它们的书籍——《正则表达式简介》。但是我知道这很傻,其中一个引言的例子对我来说没有意义。

(\d)\d\1

示例文字:

123-456-7890

(应该捕获第一个数字,123)

有人能解释一下这是怎么回事吗?

据我所知,第一个 \d 捕获了数字 123。而 \1 回溯(标记)该组以供后续使用。括号限定了该组的作用范围。但第二个 \d 是用来做什么的呢?

请用小孩或金毛犬都能听懂的简单解释。


1
要真正掌握正则表达式,去阅读:精通正则表达式(第3版) - ridgerunner
@ridgerunner - 我觉得这个对我来说有点太高级了,也许以后的日子里会好一些 :) - Rook
实际上,MRE是以教程风格编写的,从基础知识开始逐步深入。毫无疑问,这是我读过的最有用的书籍。 - ridgerunner
此问题已添加到Stack Overflow正则表达式FAQ中的“分组”部分。 - aliteralmind
2个回答

17

\d 表示的是一个数字。

这个正则表达式无法匹配字符串 "123-456-7890",但可以匹配"323"(它可能是一个更长字符串的一部分,例如 "323-456-7890"):

 (\d) : first digit ("3")
 \d   : another digit ("2")
 \1   : first group (which was "3")

如果您的书声称(\d)\d\1应该在"123-456-7890"中捕获"123",那么它可能包含一个错误...


1
如果我理解正确的话。第一个\d只是一个数字(一个字符)。在代表一组的括号中。第二个\d只是另一个数字。\1引用了最后一个括号,例如第1组。如果我想以后以这种方式进行反向引用,我可以只放置\2吗? - Rook
(\d) 匹配了3,\d 匹配了2,而且 \1 再次匹配了3,因为这是从第一组匹配/引用的内容? - Rook
@ldigas 是的,除了我没有理解你关于\2的问题。 - Denys Séguret
我可以将引用组名称命名为“2”而不是“1”,即使用\2而不是\1吗?还是\1代表第一个引用组? - Rook
没有:\1 总是第一个。第二组被命名为 \2,以此类推。 - Denys Séguret

10

(\d)\d\1 逐步解析:

  1. 第一个 \d 匹配一个数字。
  2. 括号 () 标记这个为捕获组 - 这是第一个,所以数字被记作“组 1”。
  3. 第二个 \d 表示有另一个数字。
  4. \1 意味着“这里是我们先前组 1 匹配的值” - 即第一步匹配的数字。

因此,就像 dystroy 已经说过的那样:这个正则表达式匹配的是一个由三个数字组成的序列,其中第一个和第三个数字相等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接