RegExp对象实例的lastIndex属性

每个RegExp对象的实例具有lastIndex属性,它是被查找字符串中下一次成功匹配的开始位置(犀牛书上的解释"上次匹配后的位置,用于在一个字符串中进行多次匹配"),默认值是0。 lastIndex 属性被 RegExp 对象的 exec 和 test 方法修改.并且它是可写的.lastIndex的值等于成功匹配的子串的最后一个字符在整个字符串中的索引加1。
var re = /[A-Z]/;     //此时一直从字符串开始位置匹配
var str = "Hello,World!!!";
alert(re.lastIndex);//0
var arr = re.exec(str);   //exec方法执行后,修改了re的lastIndex属性
alert(re.lastIndex);//1
arr = re.exec(str);
alert(re.lastIndex);//1
arr = re.exec(str);
alert(re.lastIndex);//1

re = /[A-Z]/g;   //全文匹配,此时是一个循环过程。
alert(re.lastIndex);//0
arr = re.exec(str);
alert(re.lastIndex);//1
arr = re.exec(str);
alert(re.lastIndex);//7 
arr = re.exec(str);
alert(re.lastIndex);//0 
arr = re.exec(str);
alert(re.lastIndex);//1 


当匹配失败(后面没有匹配),再执行exec等方法会将lastIndex设为0(开始位置)
var re = /\d/;  //var re = /\d/g;效果一样
var str = "Hello,World!!!";
alert(re.lastIndex);//0 
var arr = re.exec(str);
alert(re.lastIndex);//0


当设置了lastIndex的值时:
(1)如果指定了全文匹配g,在执行exec等方法则从指定的lastIndex位置开始匹配,如果匹配失败则lastIndex=0,如果在执行exec等方法时则从0开始匹配,如果没有匹配成功则lastIndex=0,则说明没有字符串没有一个正确匹配,如果匹配成功则lastIndex等于匹配字符最后一个字符索引加1。如果一直执行exec等方法它是一个循环的过程。
(2)如果没有指定全文匹配g,在每次执行exec等方法时都是从字符串开始位置(即lastIndex=0的位置)开始匹配,如果匹配失败则lastIndex=0,匹配成功则lastIndex等于匹配字符最后一个字符索引加1。
var re = /[A-Z]/;
var str = "Hello,World!!!";
alert(re.lastIndex);//0
re.lastIndex=2;
alert(re.lastIndex);//2
var arr = re.exec(str);
alert(re.lastIndex);//1
arr = re.exec(str);
alert(re.lastIndex);//1
arr = re.exec(str);
alert(re.lastIndex);//1

var re = /[A-Z]/g;     //全文匹配
var str = "Hello,World!!!";
alert(re.lastIndex);//0
re.lastIndex=2;
alert(re.lastIndex);//2
var arr = re.exec(str);
alert(re.lastIndex);//7
arr = re.exec(str);
alert(re.lastIndex);//0
arr = re.exec(str);
alert(re.lastIndex);//1
arr = re.exec(str);
alert(re.lastIndex);//7


总结:在执行exec等方法时如果匹配失败lastIndex=0。如果有没有全文匹配标志g,则无论匹配多少次,lastIndex都相等,如果有全文匹配标志g,则lastIndex等于匹配子串最后一个字符在整个字符串的索引加1,依次进行,知道没有匹配为0,进入下一次循环。

你可能感兴趣的:(RegExp)