今天在作正則循環匹配,碰到一個怪問題,第一次能夠匹配上,但循環第一次以後,就沒法匹配上了。猛然想起,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