正則中的全局模式

今天在使用js的test函數進行正則匹配時,發生了一個奇怪的問題,程序的運行結果顯示總有一些字符串沒法被匹配,即便它們「長得」和那些成功匹配的字符串很是類似。這些字符串示例以下:'%(ALLUSERSPROFILE)%'、'%(HOMEDRIVE)%'、'%(CommonProgramFiles)%'、'%(ProgramData)%'...等,指定的正則表達式爲/%\(|\)%/g。正則表達式

 

如上面所示的字符串,前三個均可以被成功匹配,而第四個就沒法匹配成功了。最開始覺得是字符串中包含非法字符或編碼問題,因而將第四個字符串放到第一個,結果卻顯示匹配成功。函數

 

無心中將正則中的全局標誌'g'刪除,結果顯示以前匹配不成功的字符串也被成功匹配了。很明顯,問題的所在之處就是這個全局標誌'g'。編碼

 

後經查閱資料得知,若是爲正則指定了全局標誌,那麼正則匹配會在全局模式下進行。全局模式下會有一個名爲「lastIndex」的屬性,該屬性可能會對後續的匹配操做產生影響。由於其值的含義是上一次匹配成功時,匹配位置以後下一個字符的位置。若是沒有匹配成功,該值被賦予0。該值的默認值也是0,故第一次匹配老是從字符串的[0]下標處開始進行。blog

 

結合實例分析下:第一個字符串爲'%(ALLUSERSPROFILE)%',因爲符合的匹配項「%(」位於[0]、[1]下標處,匹配成功以後,lastIndex值爲2,故第二個字符串進行匹配時是從[2]處開始的。第二個字符串'%(HOMEDRIVE)%'的匹配項是「%)」,位於[11]、[12]處,故第三個字符串從[13]處開始,即lastIndex值爲13。第三個字符串'%(CommonProgramFiles)%'的匹配項爲「%)」,位於[20]、[21],故第四個字符串要從[22]處開始。而第四個字符串全長度也不夠22,因此...匹配失敗。附圖一張,能夠看到每次匹配以前和以後lastIndex的變化。其中每行第一個數字表明第幾個字符串,第二個數字表明lastIndex值。字符串

 

明白了問題的緣由,解決方法也顯而易見了,將正則中的全局標誌'g'去掉便可。ast

相關文章
相關標籤/搜索