在 JavaScript 中,正则表达式对象可以有一个全局标志g,这会影响正则表达式在多次调用方法时的行为。在你的例子中,正则表达式/cat/g使用了全局标志,这会导致test方法的行为不同于没有全局标志的情况。
行为解释
当你使用带有全局标志g的正则表达式对象时,正则表达式对象会维护一个内部的索引(lastIndex),用于记录当前搜索位置。这会影响test方法的结果:
第一次调用re.test('catewssf'):
正则表达式从字符串的开头开始搜索,找到了"cat"。
lastIndex被更新为下一个位置(在"cat"之后的位置)。
第二次调用re.test('catewssf'):
正则表达式从lastIndex指定的位置开始继续搜索(即,从之前匹配的位置之后开始)。
因为从"e"开始没有匹配到"cat",所以返回false。
由于没有匹配,lastIndex被重置为0。
解决方案
如果你希望每次调用test都从字符串的开头开始搜索,你可以在每次调用之前手动重置lastIndex:
var re = /cat/g;
re.lastIndex = 0; // 重置 lastIndex
console.log(re.test('catewssf')); // true
re.lastIndex = 0; // 每次测试前重置 lastIndex
console.log(re.test('catewssf')); // true
或者,如果你不需要全局搜索(例如不需要exec方法在整个字符串中查找多次),只是在检查是否存在某个模式,可以去掉全局标志g:
var re = /cat/;
// 不使用全局标志
console.log(re.test('catewssf')); // true
console.log(re.test('catewssf')); // true
去掉全局标志后,每次调用test都会从字符串的开头开始,因此不会受到lastIndex的影响。