PCRE recursive pattern with 1st level condition {{1st-level-



我想匹配以函数名称开头然后以冒号开头的嵌套 Wiki 函数或 wiki 解析器函数,但是一旦我尝试让递归 pcre 正则表达式与一级测试一起工作,我就无法构建正则表达式模式。我想与以{{aFunctionName:开头后跟冒号的测试相匹配,在正则表达式中{{[wd]+:测试文本可能如下所示

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 行
  • 使用 ({{(?:[wd]+:)(?:(?:(?!{{|}}).)++|(?1))*}})
    获取任何嵌套的 wiki 函数,该函数仅获取第 3 行,但我也想匹配第 1 行和第 2 行。

但是我不知道如何构建一个正则表达式模式来测试类似的东西(写成伪代码):

{{match1st-level-Function: then anything {{nested}} or not nested }}
{{do not match simple {{nested}} things}}

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)

所有这些语法都可以与 pcre 一起使用。

如果你绝对想使用整个模式进行递归,你最终可以使用条件语句来测试你是否在嵌套部分中:

{{(?(R)|w+:)[^{}]*+(?:(?R)[^{}]*)*+}}

条件是(?(R)|w+:)的,并遵循以下架构:(?(condition) True | False)

相关内容

  • 没有找到相关文章

最新更新