正则表达式中零宽度独立子表达式是什么?

时间:2014-05-13 11:06:27

标签: regex pcre

所以我正在为PCRE寻找完整的备忘单(仍然没有找到一个,如果你可以给我看一个奖励积分,我还没有设法找到一个包含两者的奖励积分\ K和\ G)和我偶然发现this old one

现在我熟悉(?<!somestuff)(?=otherstuff)之类的外观断言,但我没有遇到过这个构造(从链接到文章):

  

(?&gt; ...)零宽度独立[sic]子表达式

有人可以解释一下它的作用,以及何时使用它?

另外可以指出包含PCRE中所有特殊符号的文档? ruby's docs甚至没有涵盖他们在正则表达式中拥有的所有功能:

[1] pry(main)> /hello\Kworld/.match("helloworld")
=> #<MatchData "world">

2 个答案:

答案 0 :(得分:2)

(?>...)是一个原子组:

  

原子组是一个在正则表达式引擎退出时自动执行的组   抛弃所有被组内任何代币记住的后退位置。   原子组是非捕获的。

     

- http://www.regular-expressions.info/atomic.html

而且,正如蒂姆指出的那样,原子组不是零宽度。

所有PCRE结构的真实列表:http://www.pcre.org/pcre.txt

答案 1 :(得分:1)

不确定为什么你说它没有记录。请参阅Regexp

  

分组可以用(?>pat)原子化。这导致了   子表达式pat独立于其余的匹配   表达式使得它匹配的内容对于其余部分变得固定   匹配,除非必须放弃整个子表达式   随后重访。通过这种方式,pat被视为不可分割的   整个。原子分组通常用于优化模式   防止正则表达式引擎不必要地回溯。

     

下面的模式中的"匹配字符串的第一个字符,   然后.*匹配Quote“。这导致整体匹配失败,所以   由.*匹配的文本被一个位置回溯,离开了。{1}}   可用于匹配"

的字符串的最后一个字符
/".*"/.match('"Quote"')     #=> #<MatchData "\"Quote\"">
     

如果.*按原子分组,则拒绝回溯引用“,甚至   虽然这意味着整体匹配失败

/"(?>.*)"/.match('"Quote"') #=> nil
相关问题