0

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

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

我想得到的文字是:

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

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

4

4 回答 4

1

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

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

捕获组:

$1

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

编辑:似乎有些人喜欢在选择答案后加入,correct然后添加可能不起作用的场景。但是,这很好,取决于使用某物的环境可以制造任何东西incorrect

原答案:

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

可选的:

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

这将保留=比赛中的标志。

于 2014-04-18T01:02:06.440 回答
0

一般来说,如果您找不到分隔符的某些独特功能(例如 Eugen Rieck 在评论中指出 -如果他只将其更改为 non-greedy ,这是一个很好的具体解决方案),标准正则表达式无法做到这一点。

一些正则表达式引擎,如 Ruby 的 Oniguruma,可以通过使用递归正则表达式。像(在我的脑海中):

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

演示

于 2014-04-18T00:54:41.130 回答
0

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

这是一个小提琴

于 2014-04-18T00:57:43.737 回答
0

克里斯,这里有两个使用递归正则表达式匹配您正在寻找的选项:

选项1:

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

选项 2:

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

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

您使用的是什么语言和正则表达式引擎?这些模式可以适应一些其他支持递归的风格。

于 2014-04-18T00:57:54.860 回答