我不熟悉 Kate,但它似乎使用QRegExp,它在许多重要方面与其他类似 Perl 的正则表达式风格不兼容。例如,大多数风格允许您通过附加问号(例如.*
=> .+?
)使单个量词非贪婪,但在 QRegExp 中,您只能使它们全部贪婪或全部非贪婪。更糟糕的是,看起来凯特甚至不允许你这样做——Non-Greedy
例如,通过一个复选框。
但无论如何,最好不要一直依赖非贪婪的量词。一方面,正如许多人所说,他们不能保证最短的匹配。你应该养成更具体的习惯,什么应该和不应该匹配,当这不是太难的时候。例如,如果您要匹配的部分不包含除示例字符串中的标签之外的任何标签,您可以这样做:
<i>[^<]*</i>(\d+)\b[^<]+<br/>\1\b[^<]*<br/>
使用[^<]*
instead of的好处.*
是它永远不会尝试匹配 next 之后的任何内容<
。 .*
总是会首先抓取文档的其余部分,只是几乎一直回溯到起点。非贪婪版本 ,.*?
最初将只匹配下一个<
,但如果稍后匹配尝试失败,它将继续并消耗<
和超越,最终消耗整个文档。
如果可以有其他标签,则可以使用[^<]*(<(?!br/>)[^<]*)*
。它将使用任何不是 的字符<
,或者<
如果它不是<br/>
标签的开头。
<i>[^<]*</i>(\d+)\b[^<]*(<(?!br/>)[^<]*)*<br/>\1\b[^<]*(<(?!br/>)[^<]*)*<br/>
顺便说一句,您所说的前瞻(我假设您的意思是\1
)实际上是反向引用。我的(?!br/>)
正则表达式中的 是前瞻的一个例子——在这种情况下是负前瞻。Kate/QRegExp 文档声称支持前瞻但非捕获组——例如——不支持(?:...)
,这就是为什么在最后一个正则表达式中使用所有捕获组的原因。
如果您可以选择切换到其他编辑器,我强烈建议您这样做。我最喜欢的是EditPad Pro;它具有我在编辑器中见过的最好的正则表达式支持。