1

我想匹配以函数名和冒号开头的嵌套 Wiki 函数或 wiki 解析器函数,但是一旦我尝试让递归 pcre 正则表达式与 1 级测试一起工作,我就无法构建正则表达式模式。我想匹配以{{aFunctionName:冒号开头的测试,在正则表达式{{[\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
  • 获取任何嵌套的 wiki 函数,使用({{(?:[\w\d]+:)(?:(?:(?!{{|}}).)++|(?1))*}})
    它只获取第 3 行,但我也想匹配第 1 行和第 2 行。

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

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

pcre 正则表达式专家有什么帮助吗?谢谢!

4

1 回答 1

2

使用这样的东西:

{{\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)

于 2016-05-19T19:54:12.803 回答