我希望匹配以函数名和冒号开头的嵌套Wiki函数或wiki解析器函数,但一旦我试图让递归pcre regex使用第一级测试,我就无法构造regex模式。我想要匹配它以{{aFunctionName:开头的测试,然后是冒号,在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]+:)(?:(?:(?!{{|}}).)++|(?1))*}})获取任何嵌套的wiki函数
它只得到第3行,但我也想匹配第1行和第2行。但是,我不知道如何构造一个regex模式来测试类似于(编写为伪代码)的内容:
{{match1st-level-Function: then anything {{nested}} or not nested }}
{{do not match simple {{nested}} things}}有pcre regex专家的帮助吗?谢谢!
发布于 2016-05-19 19:54:12
使用这样的东西:
{{\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)
https://stackoverflow.com/questions/37332551
复制相似问题