意外的Javascript RegExp行为

Dav*_*ave 9 javascript regex google-chrome

我创建一个RegExp对象(在JavaScript中)来测试数字的存在:

var test = new RegExp( '[0-9]', 'g' );
Run Code Online (Sandbox Code Playgroud)

我这样用它

console.log( test.test( '0' ) ); // true
console.log( test.test( '1' ) ); // false - why?
Run Code Online (Sandbox Code Playgroud)

这个输出更令人困惑:

console.log( test.test( '1' ) ); // true
console.log( test.test( '0' ) ); // false - why?
console.log( test.test( '1' ) ); // true
console.log( test.test( '2' ) ); // false - why?
console.log( test.test( '2' ) ); // true - correct, but why is this one true?
Run Code Online (Sandbox Code Playgroud)

如果我删除g限定符,它的行为与预期一致.

这是一个我认为是错误的错误,还是规范的一些特殊部分?是否g应该以这种方式使用限定符?(我正在为多个任务重复使用相同的表达式,因此根本没有限定符)

Exp*_*lls 7

每个文档:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/test#Description

test 在同一个全局正则表达式实例上多次调用将超过上一个匹配.

您可以确认此行为:

var test = new RegExp( '[0-9]', 'g' );
test.test('01'); //true
test.test('01'); //true
test.test('01'); //false
Run Code Online (Sandbox Code Playgroud)

g如果您想要的是确认针对各种字符串的单个匹配,则使用该标志是没有意义的.


jfr*_*d00 6

删除'g'标志.当您使用'g'标志时,它会更新lastIndex正则表达式的属性(准备对相同的字符串进行连续搜索),然后从该索引值开始下一次搜索(从而在下次搜索时给出错误的读数).

类似的问题和答案:为什么正则表达式Javascript // g标志影响状态?