相同的JavaScript函数返回随机结果
我很困惑:相同的JavaScript函数返回随机结果,javascript,Javascript,我很困惑: function is_valid(name) { var regexp_name = /^(\d|\w)*$/gi; return regexp_name.test(name); } 我做错了什么?删除/g标志 RegExp对象以某种方式被重用。当出现/g标志时,正则表达式引擎将从先前匹配的位置启动,直到整个字符串被使用 1st call: Test ^ after 1st call: Test (found
function is_valid(name) {
var regexp_name = /^(\d|\w)*$/gi;
return regexp_name.test(name);
}
我做错了什么?删除
/g
标志
RegExp对象以某种方式被重用。当出现/g
标志时,正则表达式引擎将从先前匹配的位置启动,直到整个字符串被使用
1st call: Test
^
after 1st call: Test (found "Test")
^
2nd call: Test
^
after 2nd call Test (found nothing, reset)
^
顺便说一句,\w
相当于Javascript中的[0-9a-zA-Z!]
。因此,\d |
和/i
标志是冗余的。由于您没有使用捕获的组,因此不需要保留(…)
。这就足够了:
var regexp_name = /^\w*$/;
我和你在Firebug中得到的结果一样,这里也是。如果您使用
console.log(是否有效(“!”))对其进行测试,会令人惊讶代码>结果很好。根据长期观察,返回的值在真与假之间交替。好吧,但为什么?解释一下怎么样?我不明白为什么它不消耗整个字符串。匹配到字符串的结尾。@George:$
只是一个断言。它不会消耗任何东西。结尾的空字符串可能匹配。尝试使用var re=/\w*/g;返回执行董事(姓名)代码>。您将看到最后匹配的是空字符串。@KennyTM啊,是的,我知道了。这是有道理的。谢谢。它在真与假之间交替,因为regex对象被重用为@KennyTM所说的对象。g
标志使lastIndex
属性(从何处开始下一次搜索)从0
(true-始终找到匹配项-“测试”
)跳转到4
(false-从此处起不再匹配)。为此编写了一些测试以确认此行为。
var regexp_name = /^\w*$/;