2015-06-28 71 views
0

今天對於一個項目,我試圖利用正則表達式並瞭解組和如何使用它們。我使用this現場測試後援問題是,每當我寫的正則表達式如下:正則表達式向前看

(= \ S * \ d?)

,網站給我一個錯誤:the expression can match 0 characters and therefore can match infinitely.

而這不會引發任何錯誤:

(?= \ S * \ d)(\ S {6,16})

任何人都可以向我解釋錯誤的含義是什麼。

回答

3

因爲向前看是斷言,並且它們不消耗任何字符。

(?=\S*\d) 

當你寫正則表達式這樣的,它檢查如果它包含零個或多個非空格後面跟着一個數字。但是這些字符不會被正則表達式引擎使用。指針保持在同一位置。

hello123 
| 
This is the initial position of pointer. It the checking starts from here 

hello123 
| 
(?=\S*\d). Here it matches \S 

hello123 
| 
(?=\S*\d) 

This continues till 

hello123 
     | 
    (?=\S*\d) Now the assertion is matched. The pointer backtracks to the position from where it started looking for regex. 

hello123 
| 
Now you have no more pattern to match. For the second version of the regex, the matching then begins from this postion 

是那麼有

(?=\S*\d)(\S{6,16}) 

這裏的區別,

  • (?=\S*\d)這部分做的檢查。我再說一遍,這部分不會消耗任何字符,它只是檢查。

  • (\S{6,16})該部分消耗輸入字符串中的字符。這是至少消耗6非空格字符和最多16字符。

+0

哦,這說明了很多,我認爲展望未來的工作是找到匹配並停止在已找到匹配的位置。所以這意味着斷言不能單獨使用,因爲它們只執行檢查並返回到開始位置。我們需要一個也消耗字符的正則表達式。 –

+0

@JaymitDesai你明白了。它的表現正如名稱所示。預見是否匹配發生。尋找並不意味着:) – nu11p01n73R

+0

非常感謝你! :) –