如何非贪婪的多个lookbehind匹配

2 regex non-greedy lookbehind

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

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

Result1:   <content1>
Result2:   <content1><suffix1><prefix><content2>
Run Code Online (Sandbox Code Playgroud)

RegEx2 的期望结果只是 <content2> 但它显然是贪婪的。如何使 RegEx2 不贪婪并仅使用最后一个匹配的lookbehind?

[我希望我从 NoteTab 语法正确翻译了这个。我不做太多的 RegEx 编码。<prefix>、<content> 和 <suffix> 术语仅用于表示任意字符串。只有“?<=”lookbehind 命令中的“<”是重要的。]

我怀疑这很简单,但经过太多小时的搜索,我放弃了自己解决。

谢谢您的帮助

艺术

Amb*_*ber 5

前面放个贪心的东西?

(?:.*)(?<=<prefix>)(.*)(?=<suffix2>)
Run Code Online (Sandbox Code Playgroud)

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

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

(?<=<prefix>)(.*?)(?=<suffix2>)
Run Code Online (Sandbox Code Playgroud)


Tim*_*ker 5

我建议你使用:

(?<=<prefix>)(((?!<prefix>).)*)(?=<suffix2>)
Run Code Online (Sandbox Code Playgroud)

这确保<prefix>了比赛中不能有任何内容。完整的比赛结果将是<content2>


小智 5

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

(?<=<prefix>)(?:.(?!<prefix>))*(?=<suffix>)
Run Code Online (Sandbox Code Playgroud)

这就是我想要的。

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