如何在不支持非贪婪量词的语言中模拟它们?

6
考虑以下正则表达式:<(.*)> 应用于以下字符串:

<2356> <my pal ned> <!@%@>

显然,由于贪婪的*,它将匹配整个字符串。最好的解决方案是使用非贪婪量词,例如*?。但是,许多语言和编辑器不支持这些。
对于像上面那样简单的情况,我已经通过以下正则表达式解决了这个限制:<([^>]*)> 但是,对于像这样的正则表达式start (.*) end,应用于以下字符串:

start 2356 end start my pal ned end start !@%@ end

是否有任何可行的解决办法呢?

出于好奇,有哪些语言不支持“*?”? - travis
语言支持通常相当不错。实际上,更多的是编辑器出现问题。我想不起来任何语言,但我知道我遇到过这种情况。 - Ipsquiggle
1
顺便提一下,[^>]*> 样式可能比贪婪或非贪婪匹配更有效,因为它不会导致回溯。当您可以使用此模式时,应使用它。 - bobince
2个回答

6
如果结束条件是单个字符的存在,您可以使用负字符类来代替:

如果结束条件是单个字符的存在,您可以使用负字符类来代替:

<([^>]*)>

对于更复杂的情况,当结束条件是多个字符时,可以尝试使用负向先行断言。但如果惰性匹配不被支持,则很可能先行断言也不会被支持。

((?!end).)*

您的最后选择是构建像这样可怕的东西:
(en[^d]|e[^n]|[^e])*

我之前没有考虑过前瞻。你关于它们也可能不被支持是正确的,但是正则表达式实现一直是让人惊讶的。这就是一个答案。 - Ipsquiggle
哈哈!那太可怕了。但这是普遍的,有时你必须做你必须做的事情。非常聪明。 - Ipsquiggle
1
最后一行字符串很好,但不幸的是并不总是有效。请尝试使用 start eend end - Paul

2

我将 . 替换为 [^>] ,其中 > 在这种情况下是RE中的下一个字符。


由于没有编辑,这一部分从一开始就是问题的一部分。我需要提高我的阅读理解能力。 - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接