正则表达式误用全局匹配导致的错误
正则表达式误用全局匹配导致的错误
奇怪的现象
console.log(/['"<>]/g.test('\'')); // true
console.log(/['"<>]/g.test('\'')); // true
console.log(/['"<>]/g.test('\'')); // true
var illagealReg = /['"<>]/g;
console.log(illagealReg.test('\'')); // true
console.log(illagealReg.test('\'')); // false
因为/g代表全局匹配,正则判断时内部是有一个lastIndex来记录最后匹配的位置.当重复调用的时候,会接着上次的lastIndex继续匹配,故而将导致判断出错.
解决
- 去掉/g,在不需要/g的情况下不要随意添加/g标识
- 第二次匹配前,手动将lastIndex置0,以上面的例子来说:reg.lastIndex()=0即可.
var illagealReg = /['"<>]/g;
console.log(illagealReg.lastIndex); //0
console.log(illagealReg.test('\'')); // true
console.log(illagealReg.lastIndex); //1
console.log(illagealReg.test('\'')); // false
console.log(illagealReg.lastIndex); //0