【问题标题】:PCRE regex backreference works, but subroutines do notPCRE 正则表达式反向引用有效,但子例程无效
【发布时间】:2015-07-06 21:34:32
【问题描述】:

我正在尝试匹配文本:

1.“嘿嘿嘿嘿嘿”

2.“嘿嘿嘿嘿嘿”

使用正则表达式:

一个 /(\w+) \1\w/

b /(\w+) (\w+)\w/

c /(\w+) (?1)\w/


  • 正则表达式 a 完全匹配 1,并且 2 完全,但最后一个 'y'。
  • 正则表达式 b 完全匹配 12强>。
  • 正则表达式 c 不匹配 12

http://www.rexegg.com/regex-disambiguation.html#subroutines 之后,我认为 b 和 c 是等价的。但显然,他们不是。

有什么区别?为什么子程序不工作,而复制相同的正则表达式工作?

在这里进行实验:https://regex101.com/#pcre

【问题讨论】:

    标签: regex pcre


    【解决方案1】:

    这是因为在 PCRE 中,对子模式的引用(此处为(?1) 默认情况下是原子的。

    (请注意,这种行为是 PCRE 特有的,Perl 不共享它。)

    子模式是\w+(带有贪婪量词),所有单词字符都匹配(第二个字符串中的HeyHeyy,但是由于@987654326 @ 是原子的,正则表达式引擎无法回溯并返回最后一个 y 以使 \w 成功。

    您可以使用此模式获得相同的结果:

    /(\w+) (?>\w+)\w/
         # ^-----^-- atomic group
    

    不匹配字符串,当没有原子组时,模式成功:

    /(\w+) \w+\w/
    

    更多关于原子团的信息:http://regular-expressions.info/atomic.html

    这里也描述了这种特殊性(但仅在递归上下文中):http://www.rexegg.com/regex-recursion.html (参见“递归深度是原子的”)

    【讨论】:

    • 你能解释一下“默认原子”@Casimir
    • 好的...我想我现在明白了。谢谢。你能否告诉我是否有办法“非原子化”(如果这是一个有效的短语)PCRE 正则表达式?
    • @Wraith:很遗憾,这是不可能的。
    猜你喜欢
    • 2011-08-12
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    相关资源
    最近更新 更多