Regex 正则表达式中与零宽度无关的子表达式是什么?
所以我在寻找一份完整的PCRE的备忘单(仍然没有找到,如果你能给我看的话,我还没有找到一份包含\K和\G的备忘单),我偶然发现了 现在我熟悉了lookaround断言,比如Regex 正则表达式中与零宽度无关的子表达式是什么?,regex,pcre,Regex,Pcre,所以我在寻找一份完整的PCRE的备忘单(仍然没有找到,如果你能给我看的话,我还没有找到一份包含\K和\G的备忘单),我偶然发现了 现在我熟悉了lookaround断言,比如(?或(?=otherstuff),但我没有遇到这个构造(从链接到文章): (?>…)零宽度独立[sic]子表达式 有人能解释一下它的作用,以及什么时候有用吗 另外,您可以向我指出包含PCRE中所有特殊符号的文档吗?甚至不包括它们在正则表达式中的所有功能: [1] pry(main)> /hello\Kworld/.ma
(?或(?=otherstuff)
,但我没有遇到这个构造(从链接到文章):
(?>…)零宽度独立[sic]子表达式
有人能解释一下它的作用,以及什么时候有用吗
另外,您可以向我指出包含PCRE中所有特殊符号的文档吗?甚至不包括它们在正则表达式中的所有功能:
[1] pry(main)> /hello\Kworld/.match("helloworld")
=> #<MatchData "world">
[1]pry(main)>/hello\Kworld/.match(“helloworld”)
=> #
这个(?>…)
是一个原子群:
原子组是当正则表达式引擎退出时自动退出的组
丢弃组内任何标记记住的所有回溯位置。
原子群是不可捕获的
--
而且,正如蒂姆指出的,原子群不是零宽度的
所有PCRE构造的真实列表:不确定您为什么说它没有文档记录。请参阅:
分组可以通过(?>pat
)进行原子化。这会导致
子表达式pat将独立于其他子表达式进行匹配
表达式,使其匹配的内容对于余数是固定的
除非必须放弃整个子表达式并
这样,pat就被视为不可分割的
原子分组通常用于优化模式,以便
防止正则表达式引擎不必要地回溯
下面模式中的“
与字符串的第一个字符匹配,
然后,*
匹配Quote“
。这会导致整体匹配失败,因此
通过*
匹配的文本被一个位置回溯,这将使
可匹配的字符串的最后一个字符“
…而且它根本不是零宽度,所以链接到的页面@MikeH-R是不正确的。@Tim Good catch,没有注意到。将包括它。@TimPietzcker ahhh…这解释了为什么我在谷歌上找不到答案。感谢大家整理这个问题。感谢链接到pcre.txt,我在那个网站上,不知道我怎么错过了它,一定是o没有哪一天!没问题@Mike。请注意,大多数现代编程语言的正则表达式库经常说它们是PCRE或PCRE兼容的,很少有库支持PCRE.txt
链接中列出的所有构造(可能只有Perl支持?)@BartKiers-hmm…这很有趣,构建一系列测试来了解所有perl兼容正则表达式的perl兼容性是多么有趣,我相信它实际上可以非常容易地构建,您只需要一系列正则表达式,所有正则表达式都测试一个不同的构造,然后对于每种语言,您只需要正则表达式语法就可以自动生成吃得很简单。说得好,我忘了检查ruby文档中的构造,我在寻找\K
,它们(如果我错了,请纠正我)没有记录在文档中。@MikeH-R我通常通过说perldoc perlre
来引用PCRE语法。谢谢,从现在开始,我也应该这样做。:)
/".*"/.match('"Quote"') #=> #<MatchData "\"Quote\"">
/"(?>.*)"/.match('"Quote"') #=> nil