首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有1级条件{1级测试的PCRE递归模式:任何{{ne{s}ted}

具有1级条件{1级测试的PCRE递归模式:任何{{ne{s}ted}
EN

Stack Overflow用户
提问于 2016-05-19 19:37:14
回答 1查看 240关注 0票数 1

我希望匹配以函数名和冒号开头的嵌套Wiki函数或wiki解析器函数,但一旦我试图让递归pcre regex使用第一级测试,我就无法构造regex模式。我想要匹配它以{{aFunctionName:开头的测试,然后是冒号,在regex {{[\w\d]+:中,测试文本看起来像

代码语言:javascript
复制
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模式来测试类似于(编写为伪代码)的内容:

代码语言:javascript
复制
{{match1st-level-Function: then anything {{nested}} or not nested }}
{{do not match simple {{nested}} things}}

有pcre regex专家的帮助吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-05-19 19:54:12

使用这样的东西:

代码语言:javascript
复制
{{\w+:([^{}]*+(?:{{(?1)}}[^{}]*)*+)}}

要获得递归模式,使用(?R)并不是必需的,您还可以引用在打开之前打开的任何捕获组,其编号、相对位置(从当前位置)或名称(当您使用命名捕获时)。

其他可能的语法有:

代码语言:javascript
复制
{{\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一起使用。

如果您绝对希望将整个模式用于递归,则最终可以使用一个条件语句来测试是否处于嵌套部分:

代码语言:javascript
复制
{{(?(R)|\w+:)[^{}]*+(?:(?R)[^{}]*)*+}}

条件是(?(R)|\w+:),并遵循以下模式:(?(condition) True | False)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37332551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档