非贪婪的正则表达式贪婪地行动

时间:2012-01-23 12:29:24

标签: regex

这是一个简单的例子:

文字:<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>会保留,因为我使用非贪婪匹配(.*?)。任何人都可以解释为什么它被删除?

3 个答案:

答案 0 :(得分:5)

有两场比赛:

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

答案 1 :(得分:2)

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

要避免此行为,请删除.*?,而不是尝试:

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

here on Regexr

不是匹配任何字符,而是匹配任何字符,但“&gt;”

答案 2 :(得分:0)

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

正则表达式的一个可能解决方法是将.更改为[^>],如下所示:

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

这将使其匹配除 >之外的任何字符。但是,只要>显示在引用的文字中,就会出现明显的问题。每个人都说:Regexes aren't designed to work on HTML。除非别无选择,否则不要使用它们。