今天在作正则循环匹配,碰到一个怪问题,第一次能够匹配上,但循环第一次以后,就没法匹配上了。猛然想起,RegExp中lastIndex属性,因而上网搜索了一下,将一些资料整理概括,以备从此本身查阅(记性很差)javascript
借鉴网上一个例子:http://www.dewen.org/q/468java
<script type='text/javascript'> var reTest = /^aid=(.*)/ig; var aData = [ 'aid=^$', 'aid=^$', 'aid=^$', 'aid=^$' ]; for (var i=0, l=aData.length; i<l; i++) { alert(reTest.test(aData[i])); } </script>
由于使用了全局匹配标记g
,正则表达式会记录匹配成功的位置lastIndex
,继续匹配时就从该位置日后匹配。
所以能够修改正则,去除g
标志正则表达式
var reTest = /^aid=(.*)/i;//去除g
也能够在循环匹配是设置lastIndex
:spa
for (var i=0, l=aData.length; i<l; i++) { reTest.lastIndex = 0;//设置匹配位置 alert(reTest.test(aData[i])); }
RegExp对象 是保存有关正则表达式模式匹配信息的固有全局对象。 不要将全局RegExp对象与 正则表达式对象混淆。尽管听起来像是一回事,但它们是大相径庭的。全局RegExp对象的属性包含不断更新的关于每一个匹配出现的信息,而正则表达式对象只包含出现正则表达式匹配的信息。code
这个问题与js正则表达式的问题?相似,里面详细解释了缘由对象
--------------------------- 下面是对于lastIndex 的解释 -----------------------------------------blog
每一个RegExp对象的实例具备lastIndex属性,它是被查找字符串中下一次成功匹配的开始位置(犀牛书上的解释"上次匹配后的位置,用于在一个字符串中进行屡次匹配"),默认值是0。 lastIndex 属性被 RegExp 对象的 exec 和 test 方法修改.而且它是可写的.
var re = /[A-Z]/;var str = "Hello,World!!!";alert(re.lastIndex);//0var arr = re.exec(str); //exec方法执行后,修改了re的lastIndex属性alert(re.lastIndex);//1var arr = re.exec(str);alert(re.lastIndex);//1re = /[A-Z]/g; //全文匹配alert(re.lastIndex);//0arr = re.exec(str);alert(re.lastIndex);//1arr = re.exec(str);alert(re.lastIndex);//7 ip
当匹配失败(后面没有匹配),再执行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的值时,若是指定了全文匹配g,则从指定的lastIndex位置开始匹配,若是匹配失败则lastIndex=0,在执行exec等方法
var re = /[A-Z]/;var str = "Hello,World!!!";alert(re.lastIndex);//0re.lastIndex=2;alert(re.lastIndex);//2var arr = re.exec(str);alert(re.lastIndex);//1arr = re.exec(str);alert(re.lastIndex);//1arr = re.exec(str);alert(re.lastIndex);//1var re = /[A-Z]/g; //全文匹配var str = "Hello,World!!!";alert(re.lastIndex);//0re.lastIndex=2;alert(re.lastIndex);//2var arr = re.exec(str);alert(re.lastIndex);//7arr = re.exec(str);alert(re.lastIndex);//0arr = re.exec(str);alert(re.lastIndex);//1arr = re.exec(str);alert(re.lastIndex);//7get