2012-02-14 70 views
5

在javascript中測試我的正則表達式時,我似乎得到了一致的奇怪結果。Javascript正則表達式應該通過.test(),但似乎失敗 - 爲什麼?

這裏是我的小提琴: http://jsfiddle.net/s5fYf/15/

這是從一個web項目,我要建服用。我將一個驗證對象數組傳遞給我的驗證函數,它通過它們進行迭代,根據值驗證每個規則。如果一個是錯誤的,它應該停止循環並返回一個返回對象,該對象從失敗的規則中拾取消息和cssClass。

的問題是驗證方法似乎即使正則表達式測試通過返回false,這應該是不可能的!所以我覺得我錯過了一些關鍵。從調試輸出中,您可以看到輸出的正則表達式測試通過,但在代碼中測試時明顯失敗。這與我在我的項目中看到的內容一致,如果我省略了調試輸出,則返回值基本上在true和false之間切換。

本質上/regex/.test(value)功能似乎在真假之間擺動,這是一致的,但不是我期待的...所以,我的問題是什麼導致這種奇怪的行爲!?

我過我的正則表達式的解決方案之外,據我可以看到它的工作原理。

UPDATE:

省略從我的正則表達式中的 'g' 或全局標誌,解決了這個問題。

請參閱下面的答案,那麼這個鏈接全局標誌的完整解釋和它的缺陷:

Why RegExp with global flag in Javascript give wrong results?

回答

19

它歸結爲一個事實,即JavaScript的正則表達式的test方法返回一個結果並在比賽結束後將指針移至。

所以第一個調用返回true,那麼第二個返回false。檢查這個例子:http://jsfiddle.net/B9aVA/

var regex = /^.+$/g 
var input = "Hello"; 
console.log(regex.test(input)); 
console.log(regex.test(input)); 

寫入

true 
false 

所以,你的代碼調用兩次測試:

case "regex": 
    $(".debug-info").append('<span>Result: ' + validation[i].rule.test(value) + '</span><br />'); 
    if (!validation[i].rule.test(value)) 
      returnValue.isValid = false; 
    break; 

我的建議是呼籲test一次,並把結果保存在一個變量,並用它來代替

case "regex": 
    var result = validation[i].rule.test(value); 
    $(".debug-info").append('<span>Result: ' + result + '</span><br />'); 
    if (!result) 
      returnValue.isValid = false; 
    break; 

這個故事的寓意:方法有副作用,那就是從性質區分開來。

+0

更新小提琴:http://jsfiddle.net/Ym2hW/2/ 所以現在我得到測試之間'()'和返回值的一致性。但是如果你多次觸發模糊,你會得到相同的振盪。你如何解決這個問題? – Jon 2012-02-14 11:02:16

+1

好吧所以問題在於全球旗幟,請參閱我上面的更新。 – Jon 2012-02-14 11:21:13

+0

謝謝!當我從我的正則表達式中刪除'g'全局標誌時,存儲的'test()'結果問題就消失了。全球旗幟約20%的額外正則表達式。test()調用有效時失敗。 – 2012-04-08 14:40:26