關於RegExp對象實例的lastIndex屬性的一些整理

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

相關文章
相關標籤/搜索