2010-07-25 52 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