我想匹配以函数名称开头然后以冒号开头的嵌套 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)