如何非贪婪的多个lookbehind匹配

时间:2009-08-05 09:49:07

标签: regex lookbehind non-greedy

Source:    <prefix><content1><suffix1><prefix><content2><suffix2>
Engine:    PCRE

RegEx1:    (?<=<prefix>)(.*)(?=<suffix1>)
RegEx2:    (?<=<prefix>)(.*)(?=<suffix2>)

Result1:   <content1>
Result2:   <content1><suffix1><prefix><content2>

RegEx2的理想结果只是&lt; content2&gt;但显然很贪心。 如何使RegEx2非贪婪并仅使用最后匹配的lookbehind?

[我希望我已经从NoteTab语法中正确翻译了这个。我不这样做 很多RegEx编码。 &lt;前缀&gt;,&lt;内容&gt; &安培; &LT;后缀GT;术语只是表示任意字符串。只有“&lt;”在“?&lt; =”lookbehind命令中很重要。]

我怀疑它很简单,但经过几个小时的搜索我就是这样 放弃自己解决它。

感谢您的帮助

技术

3 个答案:

答案 0 :(得分:2)

我建议您使用:

(?<=<prefix>)(((?!<prefix>).)*)(?=<suffix2>)

这可确保匹配中不存在<prefix>。完整的匹配结果为<content2>

答案 1 :(得分:2)

我遇到了同样的问题。但就我而言,它是

(?<=<prefix>)(?:.(?!<prefix>))*(?=<suffix>)

这就是我想要的。

此表达式将匹配<prefix><suffix>之间字符串联的任何内容,并且不包含子字符串<prefix>。 (我想是的。我不是很擅长正则表达式。)

答案 2 :(得分:1)

把一些贪婪的东西放在它面前?

(?:.*)(?<=<prefix>)(.*)(?=<suffix2>)

由于贪婪的(?:.*)会尽可能地吞噬,只有最小值才能与模式的其余部分相匹配 - 有效地使其余部分不贪婪。

非贪婪的.*?也可能有效:

(?<=<prefix>)(.*?)(?=<suffix2>)