2014-02-17 63 views
1

我一直在研究正則表達式幾天特別與lookarounds。我無法理解這個不匹配包含「bar」的句子的正則表達式。請解釋我這個正則表達式

^(?!.*bar).*$ 

我不明白爲什麼使用.*bar。如果有人能夠給我一個很好的解釋,這將有助於我lot.Thanks ....

+7

http://regex101.com/r/lF1gI7 – anubhava

回答

2

負面看起來是一種失敗整個比賽的東西,如果它的內部匹配的話。

因此,如果在指定的位置(在您的示例中,^指定在該行的開頭),則超前視圖中的模式匹配,整個匹配將失敗。

讓我們來看看,你有.*bar。如果.*bar匹配,則整個正則表達式失敗。

.*bar什麼時候匹配?答案是它匹配只要有該行bar

bar 
foo bar 
foo bar baz 

比方說,有沒有任何.*。因此,您將在bar處於負向預測。如果bar只匹配,則整個匹配失敗。現在請記住,這個檢查是在開始。

bar 
foo bar 
foo bar baz 

第一行是唯一一個匹配bar的開始處。因此^(?!bar).*$只會阻止一行開頭的匹配,但如果有bar,則^(?!.*bar).*$將阻止匹配中任何位置的匹配。

希望,這使得它更清楚一點:)

0

編輯:固定的例子

(?!.*bar) 

是負先行意味着它會檢查,以確保*。酒吧不在線。

下面是如何使用負向前看符號(See it in action)的例子:

(?!GBP).*\d{3}.* 

這可以確保匹配三位數,只有當他們沒有用術語「GBP」

+0

你並不需要在您的示例負先行... [鏈接](HTTP:/ /regex101.com/r/uS1mK9) – Jerry

+0

好點,我會修復。 – emh

+0

好吧,我相信你在試用時會意識到,如果你沒有錨點,負面視線仍然會匹配,是的?在你的例子中,更好的解決方案是兩個負面lookbehinds和一個字邊界,以防止匹配超過3個數字:[link](http:// regex101。com/r/lD6zY1) – Jerry

0

之前正則表達式

^(?!.*bar).*$ 

Source

 
NODE      EXPLANATION 
-------------------------------------------------------------------------------- 
^      the beginning of the string 
-------------------------------------------------------------------------------- 
    (?!      look ahead to see if there is not: 
-------------------------------------------------------------------------------- 
    .*      any character except \n (0 or more times 
          (matching the most amount possible)) 
-------------------------------------------------------------------------------- 
    bar      'bar' 
-------------------------------------------------------------------------------- 
)      end of look-ahead 
-------------------------------------------------------------------------------- 
    .*      any character except \n (0 or more times 
          (matching the most amount possible)) 
-------------------------------------------------------------------------------- 
    $      before an optional \n, and the end of the 
          string