RegExp.test()异常分析
现象
代码如下:
var a= /^(\d{1,3}\.){3}\d{1,3}$/g
a.test('192.168.1.1');
// true
a.test('192.168.1.1');
// false
如上的代码,第一次测试返回true,第二次以及之后的调用都会返回false。
原因
这是因为RegExp.test()方法,第一次从位置0开始查找,可以匹配;第二次的查找位置就不是0了,说以就不能匹配了(这个原因是aitangyong说的,应该是这个道理,后来发现是加上了【g】修饰符才会有这个问题)。
解决方法:
方案1
去掉正则修饰符 g ,如下:
var a= /^(\d{1,3}\.){3}\d{1,3}$/;
a.test('192.168.1.1');
// true
a.test('192.168.1.1');
// true
方案2
不要复用RegExp,每次测试前都使用新的RegExp对象。上述代码改为:
function getReg(){
var a= /^(\d{1,3}\.){3}\d{1,3}$/g;
return a;
}
getReg().test('192.168.1.1');
// true
getReg().test('192.168.1.1');
// true