在正则表达式中获取最外层分隔符

时间:2014-04-18 00:49:27

标签: regex vb.net recursive-regex

有没有办法使用正则表达式来获取最外层分隔符之间的文本?我在这里有一个字符串,希望在最外面的{%%%%%%}分隔符之间获取文字:

Hello {%%%=Select(DepartmentID,1,{%%%=if(Gender="M","Mr.","Ms.")%%%}%%%} {%LastName%}

我想要的文字是:

=Select(DepartmentID,1,{%%%=if(Gender="M","Mr.","Ms.")%%%}

正则表达式会是什么?我知道里面的文字没有多大意义,这只是一个例子。

4 个答案:

答案 0 :(得分:1)

这种模式将做一个积极的前瞻:

[^%=]*.{%%%(.+)%%%}.+[^%}]*

捕获组:

$1

示例:http://regex101.com/r/eG4fV9

编辑:似乎有些人喜欢在选择答案correct之后出现,然后添加可能无法工作的场景。但是,根据使用某物的情况,可以做任何事情incorrect

原始答案:

(?<={%%%=).+(?=}%%%)[^%]

可选的:

[^%=]*.{%%%=(.+)%%%}.+[^%}]*

这将在匹配中保留=符号。

答案 1 :(得分:0)

一般情况下,如果你找不到分隔符的一些独特功能(例如Eugen Rieck在评论中指出的话 - 它是一个很好的特定解决方案如果他只将其改为非贪婪< / strike>),标准的正则表达式无法做到。

一些正则表达式引擎,如Ruby的Oniguruma,可以使用递归正则表达式。像(在我头顶)的东西:

/{(?<braced>[^{}]*(?:{\g<braced>}[^{}]*)?)}/

Demo

答案 2 :(得分:0)

试试这个:/.*?\{\%\%\%(.*)\%\%\%\}.*/

这是fiddle

答案 3 :(得分:0)

Chris,这里有两个选项可以匹配你正在寻找的东西,使用递归正则表达式:

选项1:

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

选项2:

\{(([^{}]*+)(?:(?R)(?2))*)\}

这是PCRE语法,例如在PHP中。

您使用的是哪种语言和正则表达式引擎?这些模式可以适应其他几种支持递归的方式。