【问题标题】:Purpose of the \G anchor in regular expressions正则表达式中 \G 锚点的用途
【发布时间】:2010-08-06 21:10:47
【问题描述】:

我只是不明白 \G 锚点的作用。

如果我在1122aa33 上执行/\G\d\d/,它将匹配1122。但是,当我在 1122aa33 上尝试 /\d\d\G/ 时,它什么都不匹配。

谁能启发我?

【问题讨论】:

    标签: regex


    【解决方案1】:

    \G 是一个anchor which matches the previous match position

    在第一遍时,\G 等价于\A,它是字符串锚点的开始。因为\d\d\A 永远不会匹配任何东西(因为你怎么能在字符串开头之前有两个数字?),\d\d\G 也永远不会匹配任何东西。

    【讨论】:

    • 所以这意味着 \G 仅用于检查以前的匹配项?.. 所以 \d\d​​\G 是纯粹的无效语法对吗?
    • 它本身并不无效,但它毫无意义。基本上,正则表达式引擎会在找到匹配项后继续评估您的字符串,或者查看该匹配项是否可以扩展(即带有字符串“abc”的/.*/ 将首先匹配a,然后将匹配项扩展为@ 987654329@,然后到abc) 或者如果可以找到任何其他匹配项。在后一种情况下,\G 指定后续匹配必须在前一个匹配之后开始。
    • 是的,你的措辞(好多)更好:它确实不是无效。
    • @DanielVandersluis 很抱歉再次揭开这个话题,但毫无意义的部分在我脑海中并不完全清楚。 \G 匹配字符串的开头或最后一个匹配的结尾(Java),因此,当我在“dog dog”上使用 \Gdog 时,我只得到第一条狗。当我放 dog\G 时,它一开始不匹配,因为行开始之前没有字符,对吧?因此,从那时起就不能再有匹配了,因为没有第一个匹配(非连续匹配)。此外,由于引擎在一场比赛后向前移动,因此 dog\G 没有意义,因为没有反向匹配(我假设)。
    【解决方案2】:

    根据this

    锚 \G 匹配上一次匹配结束的位置。 在第一次匹配尝试期间,\G 以 \A 的方式匹配字符串的开头。

    现在,要实际回答您的问题:在第二个示例中,没有结果的示例 \G 无法匹配字符串的开头,因为您首先要寻找两位数,并且没有初始匹配, \G 也不会匹配任何其他内容。

    【讨论】:

      【解决方案3】:

      Reference link

      它基本上从“上一个匹配”的末尾开始匹配,在第一次运行正则表达式时,它被认为是字符串的开头。

      换句话说,如果您在字符串1122aa33 上运行两次/\G\d\d/,第二次运行将返回22 上的匹配项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        相关资源
        最近更新 更多