所以我正在为PCRE寻找完整的备忘单(仍然没有找到一个,如果你可以给我看一个奖励积分,我还没有设法找到一个包含两者的奖励积分\ K和\ G)和我偶然发现this old one。
现在我熟悉(?<!somestuff)
或(?=otherstuff)
之类的外观断言,但我没有遇到过这个构造(从链接到文章):
(?&gt; ...)零宽度独立[sic]子表达式
有人可以解释一下它的作用,以及何时使用它?
另外可以指出包含PCRE中所有特殊符号的文档? ruby's docs甚至没有涵盖他们在正则表达式中拥有的所有功能:
[1] pry(main)> /hello\Kworld/.match("helloworld")
=> #<MatchData "world">
答案 0 :(得分:2)
(?>...)
是一个原子组:
原子组是一个在正则表达式引擎退出时自动执行的组 抛弃所有被组内任何代币记住的后退位置。 原子组是非捕获的。
而且,正如蒂姆指出的那样,原子组不是零宽度。
所有PCRE结构的真实列表:http://www.pcre.org/pcre.txt
答案 1 :(得分:1)
不确定为什么你说它没有记录。请参阅Regexp:
分组可以用(
?>pat
)原子化。这导致了 子表达式pat独立于其余的匹配 表达式使得它匹配的内容对于其余部分变得固定 匹配,除非必须放弃整个子表达式 随后重访。通过这种方式,pat被视为不可分割的 整个。原子分组通常用于优化模式 防止正则表达式引擎不必要地回溯。下面的模式中的
的字符串的最后一个字符"
匹配字符串的第一个字符, 然后.*
匹配Quote“
。这导致整体匹配失败,所以 由.*
匹配的文本被一个位置回溯,离开了。{1}} 可用于匹配"
/".*"/.match('"Quote"') #=> #<MatchData "\"Quote\"">
如果
.*
按原子分组,则拒绝回溯引用“,甚至 虽然这意味着整体匹配失败/"(?>.*)"/.match('"Quote"') #=> nil