【原创】正则对象的RegExp.prototype.test()方法,全局匹配结果反转的问题

348 阅读1分钟

从MDN上看到RegExp.prototype.test()方法是执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true 或 false。

这没问题,可以使用

	var re = /\d/;
	console.log(re.test("4")); // true
	console.log(re.test("4")); // true
	console.log(re.test("4")); // true
	console.log(re.test("4")); // true

但是当学生写了一个全局匹配,同一个正则调用了多次,出现了第二次的结果与第一次的结果相反的问题,如下:

	var re = /\d/g;
	console.log(re.test("4")); // true
	console.log(re.test("4")); // false
	console.log(re.test("4")); // true
	console.log(re.test("4")); // false

这时候一下子也不知道是什么原因了,然后去MDN上查了一下,知道了原因,在RegExp对象上面有一个属性(注意不是方法) lastIndex,下面是MDN截图

所以我打印了一下 每一次的lastIndex

	var re = /\d/g;
	console.log( re.test("2"), re.lastIndex ); // true 1
	console.log( re.test("2"), re.lastIndex ); // false 0 
	console.log( re.test("2"), re.lastIndex ); // true 1
	console.log( re.test("2"), re.lastIndex ); // false 0

第一次匹配结果为 true 表示匹配成功,此时 lastIndex 记录下一次匹配的起始位置为 1。 于是第二次匹配的时候 从 "1" 字符串索引 1 的位置匹配,当然就匹配失败了,因为这个字符串只有一个字符,他的索引是 0。

为了让大家更方便理解lastIndex作用看下面例子:

	var re = /\d/g;
	console.log( re.test("3"), re.lastIndex ); // true 1
	console.log( re.test("12"), re.lastIndex ); // true 2
	console.log( re.test("111"), re.lastIndex ); // true 3
	console.log( re.test("122"), re.lastIndex ); // false 0