2010-07-23 42 views
0

我使用下面的正則表達式在我的代碼來驗證期權代碼:如何將此正向lookbehind轉換爲前瞻斷言?

^([A-Za-z]{1,5}\d? +\b(?<=^.{6}))[0-9]{6}[CcPp][0-9]{8}$ 

如果你注意到,我使用的是負向後斷言,以確認先前的比賽只有6個字符。

但是,JScript Regex顯然不支持lookbehinds,但它確實支持lookahead。

所以,我想,如果我不喜歡的東西:

^((?=^.{6})[A-Za-z]{1,5}\d? +\b)[0-9]{6}[CcPp][0-9]{8}$ 

這會工作。

但是,它似乎不會以相同的方式限制它。在第一個例子中,說「我身後的比賽長度爲6個字符」是有用的。但是,現在看起來這是行不通的,因爲即使不在第一組中,也會有6個字符匹配。

Should fail: 
1GOOG 12E456C12345678 
GOOG 12E456C12345678 
GE 4 12E456C12345678 
GE4 12E456C12345678 

Should pass: 
GOOG1 123456C12345678 
F5 123456C12345678 

如何才能成功地我這個回顧後轉換成一個前瞻,這樣我可以在JavaScript中使用這個表達式:

測試用例的一些例子我的工作?

回答

2

爲什麼不檢查5個字符,然後是空格,然後是非空格?

(?=.{5}\s\S) 

(或全模式的情況下...)

^(?=.{5}\s\S)([A-Za-z]{1,5}\d? +\b)[0-9]{6}[CcPp][0-9]{8}$ 
+0

將匹配'GE 4 123456C12345678'。假陽性。 4和1之間有兩個空格。註釋截斷空格! – Welbog 2010-07-23 16:47:41

+0

不,它不會 - 因爲實際模式(*不是* lookahead)將不匹配它。實際匹配模式中只有一個地方接受空格。 – Amber 2010-07-23 16:48:44

+0

看起來它必須以1到5個字符開頭,然後是一個數字,所以他無法與之匹敵。 – 2010-07-23 16:48:58