【问题标题】:Have trouble understanding capturing groups and back references难以理解捕获组和反向引用
【发布时间】:2014-02-19 12:12:22
【问题描述】:

为了整理一下我对正则表达式的了解,我决定阅读一本关于正则表达式的书,正则表达式简介。而且我知道这很愚蠢,但其中一个介绍性示例对我来说没有意义。

(\d)\d\1

示例文本:

123-456-7890

(应捕获第一个数字,123

谁能解释一下这里发生了什么?

据我所知,第一个 \d 捕获数字 123。\1 反向引用(标记)该组以供以后使用。括号限制了组的范围。但是第二个\d 是做什么的呢?

解释简单,喜欢小孩或金毛猎犬者优先。

【问题讨论】:

  • 要真正了解正则表达式,请阅读:Mastering Regular Expressions (3rd Edition)
  • @ridgerunner - 我认为这个阶段对我来说有点太先进了。也许,在未来的日子里:)
  • 实际上,MRE 是以教程的形式编写的,并且从最基础的基础开始。放下手,我读过的最有用的书。
  • 此问题已添加到Stack Overflow Regular Expression FAQ 的“群组”下。

标签: regex


【解决方案1】:

\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",那么它可能包含错误...

【讨论】:

  • 如果我理解你的话。第一个 \d 只是一个数字(一个字符)。在代表一个组的括号中。第二个 \d 只是另一个数字。 \1 引用最后一个括号,例如第一组。如果我以后想以这种方式反向引用它,我可以只放 \2 吗?
  • (\d) 匹配 3,\d 匹配 2,并且 \1 再次匹配 3,因为这是从第一组匹配/引用的内容?
  • @ldigas 是的,除了我不明白你关于 \2 的问题。
  • 我可以将它命名为 ref。组“2”... \2 而不是 \1,还是 \1 代表 1st?
  • 否:\1 始终是第一个。第二组命名为\2等。
【解决方案2】:

(\d)\d\1一步一步:

  1. 第一个\d 匹配一个数字
  2. 括号 () 将此标记为捕获组 - 这是第一个,因此该数字被记住为“组 1”
  3. 第二个\d 说还有一个数字
  4. \1 说“这是我们之前的第 1 组的值” - 这是第 1 步中匹配的数字。

就像dystroy已经说过的那样:正则表达式应该匹配一个三位数字的序列,其中第一位和第三位是相等的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 2019-06-01
    • 2011-12-30
    相关资源
    最近更新 更多