代码之家  ›  专栏  ›  技术社区  ›  Ipsquiggle

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

  •  4
  • Ipsquiggle  · 技术社区  · 15 年前

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

    应用于此字符串:

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

    显然,它将匹配整个字符串,因为 * . 最好的解决方案是使用非贪婪量词,如 *?

    对于像上面这样的简单情况,我使用如下正则表达式绕过了这个限制: <([^>]*)>

    start (.*) end

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

    有追索权吗?

    2 回复  |  直到 15 年前
        1
  •  6
  •   Mark Byers    15 年前

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

    <([^>]*)>
    

    对于结束条件为多个字符的更复杂的情况,您可以尝试负前瞻,但如果不支持延迟匹配,则lookaheads可能不会:

    ((?!end).)*
    

    你最后的办法是建造这样可怕的东西:

    (en[^d]|e[^n]|[^e])*
    
        2
  •  2
  •   Mark Ransom    15 年前

    . [^>] 哪里 >