如何非贪婪多重回顾后比赛(How to non-greedy multiple lookbehind

2019-06-27 23:49发布

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

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

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

对于RegEx2期望的结果仅仅是<内容2>,但它显然是贪婪。 如何让RegEx2非贪婪,只使用最后一个匹配的回顾后?

[我希望我已经从NoteTab语法正确翻译这一点。 我没有做很多的正则表达式的编码。 在<前缀>,<内容>&<后缀>术语只是为了表示任意字符串。 只有“<”,在“?<=”回顾后命令是显著。]

我怀疑这是一些简单的,但太多的时间寻找我解决我自己放弃的了。

谢谢您的帮助

艺术

Answer 1:

我建议你使用:

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

这可以确保不能有任何<prefix>比赛里面。 完整的匹配结果将是<content2>



Answer 2:

我有同样的问题。 但对我来说这是

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

这确实是我想要的。

此表达式将匹配任何是字符之间的串联<prefix><suffix>并且不包含子串<prefix> 。 (我是这么认为的。我不是在正则表达式非常好。)



Answer 3:

把贪婪的东西在它的前面?

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

由于贪婪(?:.*)将吞噬尽可能多的,因为它可以,只有最小将由模式的其余部分匹配-有效地使其他非贪婪。

非贪婪.*? 也可能工作:

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


文章来源: How to non-greedy multiple lookbehind matches