2010-07-25 77 views
3

我很困惑:相同的JavaScript函數返回隨機結果

function is_valid(name) { 
    var regexp_name = /^(\d|\w)*$/gi; 
    return regexp_name.test(name); 
} 

// Console 
console.log(is_valid("Test")); 
=> true 

console.log(is_valid("Test")); 
=> false 

console.log(is_valid("Test")); 
=> true 

console.log(is_valid("Test")); 
=> false 

我在做什麼錯?

+0

我在Firebug中得到了和你一樣的結果。 – 2010-07-25 15:44:31

+0

也一樣。令人驚訝的是,如果你用'console.log(is_valid(「!#」))來測試它,''事實證明很好。並根據長時間觀察,返回的值在真假之間交替。 – mauris 2010-07-25 15:45:53

回答

6

刪除/g標誌。

RegExp對象以某種方式重用。當/g標誌存在時,正則表達式引擎將從之前的匹配位置開始,直到整個字符串被消耗完。

1st call:  Test 
       ^
after 1st call: Test (found "Test") 
        ^
2nd call:  Test 
        ^
after 2nd call Test (found nothing, reset) 
       ^

BTW,\w相當於在Javascript [0-9a-zA-Z_]。因此,\d|/i標誌是多餘的。而且由於您不使用捕獲的組,因此不需要保留(…)。以下就足夠了:

var regexp_name = /^\w*$/; 
+0

耶是刪除它使正則表達式工作正常。 – mauris 2010-07-25 15:49:03

+3

好的,但是爲什麼?如何解釋? – 2010-07-25 15:49:26

+0

我不明白爲什麼它不消耗整個字符串。匹配到字符串的末尾。 – 2010-07-25 15:56:02