2012-01-23 162 views
2

這裏有一個簡單的例子:非貪婪正則表達式的行爲貪婪地

文字:<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>將保持不變。任何人都可以解釋爲什麼它被刪除?

+0

以下內容是什麼意思:*「當匹配被空字符串替換」*? –

+0

您的正則表達式匹配整個輸入標記,因此引擎會拾取整個輸入標記並用空字符串替換它。然後會發生什麼是你的三個輸入標籤完全消失。 – BoltClock

+1

@BoltClock,不,模式匹配兩次:** 1:**''and ** 2:**''。或者我誤解了? –

回答

5

有兩個匹配:

  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"。這是一場比賽,而且非貪婪。

+0

現在就去。比你。 – Ree

2

aix已經解釋過,爲什麼它匹配中間部分。

爲了避免這種情況,擺脫.*?的,而是試試這個:

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

看到它here on Regexr

相反匹配任何字符,匹配任何,但 「>」

0

aiz的答案是正確的 - 第二場比賽包括第二和第三個輸入標籤。爲您的正則表達式

一個可能的解決將是改變.[^>],像這樣:

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

這將導致它的任何字符匹配除了>。但是,每當>出現在引用文字中時,就會有明顯的問題。正如大家總說的:Regexes aren't designed to work on HTML。除非你別無選擇,否則不要使用它們。