【问题标题】:Non-greedy regex acts greedily非贪婪的正则表达式贪婪地行动
【发布时间】:2012-01-23 12:29:23
【问题描述】:

这是一个简单的例子:

文字:<input name="zzz" value="18754" type="hidden"><input name="zzz" value="18311" type="hidden"><input name="zzz" value="17138" type="hidden">

正则表达式:/<input.*?value="(18754|17138)".*?>/

当匹配被一个空字符串替换时,结果是一个空字符串。我预计中间的<input> 会保留,因为我使用的是非贪婪匹配(.*?)。任何人都可以解释为什么它被删除?

【问题讨论】:

  • 以下是什么意思:“当匹配被空字符串替换时”?
  • 您的正则表达式匹配整个输入标签,因此引擎会选取整个输入标签并将其替换为空字符串。然后发生的事情是您的三个输入标签完全消失了。
  • @BoltClock,不,模式匹配两次:1: <input name="zzz" value="18754" type="hidden">2: <input name="zzz" value="18311" type="hidden"><input name="zzz" value="17138" type="hidden">。还是我误会了?
  • @Bart Kiers:哦等等……我现在明白了。是的,我的坏...
  • @BoltClock: 但正则表达式不应匹配中间的<input>。我不明白为什么会这样。

标签: regex


【解决方案1】:

有两个匹配项:

  1. <input name="zzz" value="18754" type="hidden">
  2. <input name="zzz" value="18311" type="hidden"><input name="zzz" value="17138" type="hidden">

在第二种情况下,第一个 .*? 匹配 name="zzz" value="18311" type="hidden"><input name="zzz"。这是一场比赛,而且是非贪婪的。

【讨论】:

    【解决方案2】:

    aix 已经解释过了,为什么它匹配中间部分。

    要避免这种行为,请去掉.*?,试试这个:

    /<input[^>]*value="(18754|17138)"[^>]*>/
    

    here on Regexr

    不是匹配任何字符,而是匹配任何字符,但是">"

    【讨论】:

      【解决方案3】:

      aiz 的答案是正确的——第二个匹配项包括第二个和第三个输入标签。

      一种可能的正则表达式修复方法是将. 更改为[^&gt;],如下所示:

      /<input[^>]*?value="(18754|17138)"[^>]*?>/
      

      这将导致它匹配任何字符除了 &gt;。但是,每当&gt; 出现在引用的文字中时,就会出现明显的问题。正如大家常说的:Regexes aren't designed to work on HTML。除非别无选择,否则不要使用它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-15
        • 2011-08-29
        • 1970-01-01
        • 2011-04-27
        • 2010-10-20
        相关资源
        最近更新 更多