正则表达式中的lastIndex属性,这个属性用于规定下次匹配的起始位置。
如果是 exec() 或 test() 方法匹配,每次匹配之后这个lastIndex的值都是0,也就是每次都从头开始匹配
function reg(num){
var a = /(\d{4})(\d{2})/;
var b=a.test(num);
console.log('b',b); // true
console.log('lastIndex',a.lastIndex); // 0
var c=a.test(num);
console.log('c',c); // true
console.log('lastIndex',a.lastIndex); // 0
var d=a.test(num);
console.log('d',d); // true
console.log('lastIndex',a.lastIndex); // 0
}
reg('199709a199801');
但是如果正则表达式是全局匹配,也就是加了g参数,这个lastIndex的值就是匹配成功之后的下一次开始匹配的位置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。
function reg(num){
var a = /(\d{4})(\d{2})/;
var b=a.test(num);
console.log('b',b); // true
console.log('lastIndex',a.lastIndex); // 6
var c=a.test(num);
console.log('c',c); // true
console.log('lastIndex',a.lastIndex); // 13
var d=a.test(num);
console.log('d',d); // false
console.log('lastIndex',a.lastIndex); // 0
}
reg('199709a199801');
而compile()方法就是使正则表达式是全局匹配,也就是加了g参数,这个lastIndex的值都一直是0。
function reg(num){
var a = /(\d{4})(\d{2})/;
a.compile();
var b=a.test(num);
console.log('b',b); // true
console.log('lastIndex',a.lastIndex); // 0
var c=a.test(num);
console.log('c',c); // true
console.log('lastIndex',a.lastIndex); // 0
var d=a.test(num);
console.log('d',d); // true
console.log('lastIndex',a.lastIndex); // 0
}
reg('199709a199801');
注意:compile()方法已经是不推荐使用的了,因为我们可以通过a.lastIndex=0
的方式来修改下一次开始匹配的位置,lastIndex是一个可读性属性来的。加上compile()方法原来的用法是创建一个正则表达式,和构造函数效果是一样的所以准备要被停止支持了。
详细可以去看MDN文档里明确说明,点击打开MDN文档。