我在java脚本中有以下代码
var regexp = /\$[A-Z]+[0-9]+/g;
for (var i = 0; i < 6; i++) {
if (regexp.test("$A1")) {
console.log("Matched");
}
else {
console.log("Unmatched");
}
}
请在浏览器控制台上运行。它将打印替代匹配和不匹配。任何人都可以说明原因。
答案 0 :(得分:4)
在字符串上调用test
后,匹配后将设置lastIndex
指针。
Before:
$A1
^
After:
$A1
^
当它结束时,指针将被重置为字符串的开头。
您可以尝试'$ A1 $ A1',结果将是
Matched
Matched
Unmatched
...
此行为在15.10.6.2 ECMAScript Language Spec中定义。
步骤11.如果全球属实, 一个。使用参数“
lastIndex
”,e和true调用R的[[Put]]内部方法。
答案 1 :(得分:1)
我已将您的代码缩小到一个简单的示例:
var re = /a/g, // global expression to test for the occurrence of 'a'
s = 'aa'; // a string with multiple 'a'
> re.test(s)
true
> re.lastIndex
1
> re.test(s)
true
> re.lastIndex
2
> re.test(s)
false
> re.lastIndex
0
这只适用于全局正则表达式!
来自MDN documentation on .test()
:
与
exec
(或与之结合使用)一样,在同一个全局正则表达式实例上多次调用的test
将超过上一个匹配。
答案 2 :(得分:0)
这是因为您使用全局标记g
,每次调用.test
时,都会更新正则表达式对象的.lastIndex
属性。
如果您不使用g
标记,那么您可以看到不同的结果。
答案 3 :(得分:0)
第一行中的'g'不正确,您没有在此处执行替换,而是匹配,删除它,您将获得预期的行为。
var regexp = / \ $ [A-Z] + [0-9] + / g;应该是:var regexp = / \ $ [A-Z] + [0-9] + /