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

时间:2010-01-15 21:14:50

标签: regex

考虑这个正则表达式:<(.*)>

对此字符串应用:

  

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

显然,由于贪婪的*,它会匹配整个字符串。最好的解决方案是使用非贪婪量词,如*?。但是,许多语言和编辑都不支持这些。

对于像上面这样的简单案例,我已经使用这样的正则表达式解决了这个限制:<([^>]*)>

但是像这样的正则表达式可以做些什么呢? start (.*) end

对此字符串应用:

  

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

有没有任何追索权?

2 个答案:

答案 0 :(得分:5)

如果结束条件是单个字符的存在,则可以使用否定字符类:

<([^>]*)>

对于结束条件为多个字符的更复杂情况,您可以尝试使用否定前瞻,但如果不支持延迟匹配,那么前瞻的可能性也不会是:

((?!end).)*

你最后的办法是建造一些可怕的东西:

(en[^d]|e[^n]|[^e])*

答案 1 :(得分:2)

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