Php 具有第一级条件的PCRE递归模式{{1st-level test:anything{ne{{{s}}}ted}
我想匹配以functionname和冒号开头的嵌套Wiki函数或Wiki解析器函数,但一旦我尝试使用第一级测试,我就无法构建正则表达式模式。我想匹配以Php 具有第一级条件的PCRE递归模式{{1st-level test:anything{ne{{{s}}}ted},php,regex,recursion,pcre,wikitext,Php,Regex,Recursion,Pcre,Wikitext,我想匹配以functionname和冒号开头的嵌套Wiki函数或Wiki解析器函数,但一旦我尝试使用第一级测试,我就无法构建正则表达式模式。我想匹配以{{affunctionname:后跟冒号开头的测试,在regex{{[\w\d]+:中,测试文本可以如下所示 1 {{DEFAULTSORT: shall be matched {{PAGENAME}} }} 2 {{DEFAULTSORT: shall be matched }} 3 {{DEFAULTSORT: shall be matche
{{affunctionname:
后跟冒号开头的测试,在regex{{[\w\d]+:
中,测试文本可以如下所示
1 {{DEFAULTSORT: shall be matched {{PAGENAME}} }}
2 {{DEFAULTSORT: shall be matched }}
3 {{DEFAULTSORT: shall be matched {{PAGENAMEE: some text}} }}
4 Lorem ipsum {{VARIABLE shall not be matched}}
5 {{Some template|param={{VARIABLE}} shall not be matched }}
我能
- 使用
{{(?:(?:(?!{{{{{{{{}])++{{{}(?R))*}
获取第1、2、3、4和5行 - 使用
({{(?:[\w\d]+:)(?:(?:(?!{{{{{{}})+++{124;(?1))*}})获取任何嵌套wiki函数
,该函数仅获取第3行,但我还希望匹配第1行和第2行
pcre正则表达式专家有什么帮助吗?谢谢!请使用以下方法:
{{\w+:([^{}]*+(?:{{(?1)}}[^{}]*)*+)}}
要获得递归模式,使用(?R)
不是强制性的,您还可以引用以前打开的任何捕获组及其编号、相对位置(从当前位置)或名称(使用命名捕获时)
其他可能的语法包括:
{{\w+:([^{}]*+(?:{{(?-1)}}[^{}]*)*+)}}
# ^------ relative reference: the last group on the left
{{\w+:([^{}]*+(?:{{\g<1>}}[^{}]*)*+)}}
# ^----- oniguruma syntax
{{\w+:([^{}]*+(?:{{\g<-1>}}[^{}]*)*+)}}
# ^----- relative with oniguruma syntax
{{\w+:(?<name>[^{}]*+(?:{{\g<name>}}[^{}]*)*+)}}
# ^---- named capture (oniguruma)
{{\w+:(?<name>[^{}]*+(?:{{(?&name)}}[^{}]*)*+)}}
# ^---- named capture (perl syntax)
条件是
(?(R)|\w+:)
,并遵循此模式:(?(条件)True | False)
谢谢。仅在上测试{…}
的性能,我意识到{(?:(?:(?!{{{124;}}}.*+{124;((R))*}
比使用{([^[^:}+}}}.++}}}代码[*}测试性能需要更长、更多的步骤(比较了将近100:1次)。你能解释一下原因吗?或者搜索引擎在模式中的哪一步比在其他模式中尝试处理更多的可能性?@andreas.naturwiki:(?:(?!不是那样)。*
是一个缓慢的过程,因为对于每个字符,必须测试前视(以及其中的子模式)。编写(?:this+;that+)*+
已经快得多了(贪婪量词、防止回溯的所有格量词,只需测试交替)。但更好的方法是“展开”模式以避免此交替测试:this*+(?:that+this*)*+
@andreas.naturwiki:另外,注意,此模式没有约束,因为它可以匹配空字符串,并且由于使用了所有格量词,模式匹配的所有内容都变成了原子。该构造产生接近零的回溯,并且在“this”时需要很少的步骤是一个字符类。@andreas.naturwiki:在讨论性能之前,您的注释中的两个正则表达式并不相等。您的第一个正则表达式匹配lone{
和}
,而第二个正则表达式不匹配。
{{\w+:([^{}]*+(?:{{(?-1)}}[^{}]*)*+)}}
# ^------ relative reference: the last group on the left
{{\w+:([^{}]*+(?:{{\g<1>}}[^{}]*)*+)}}
# ^----- oniguruma syntax
{{\w+:([^{}]*+(?:{{\g<-1>}}[^{}]*)*+)}}
# ^----- relative with oniguruma syntax
{{\w+:(?<name>[^{}]*+(?:{{\g<name>}}[^{}]*)*+)}}
# ^---- named capture (oniguruma)
{{\w+:(?<name>[^{}]*+(?:{{(?&name)}}[^{}]*)*+)}}
# ^---- named capture (perl syntax)
{{(?(R)|\w+:)[^{}]*+(?:(?R)[^{}]*)*+}}