Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相同的JavaScript函数返回随机结果_Javascript - Fatal编程技术网

相同的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*$/;