先看一個很有意思的例子:
用字面量的方式定義了一個正則表達式 /\w/g,再重復匹配字符串 ‘ab’ 的時候,出現了結果不唯一的現象。
很多新手都對這種現象感到困惑,難道是正則表達式不穩定嗎?
接下來我們深入學習一下,Javascript中的RegExp對象。
RegExp對象的屬性
1. global:是否全文搜索,默認 false;
2. ignore case : 是否大小寫敏感,默認是 false;
3. muitiline: 多行搜索,默認值是 false;
4. lastIndex: 是當前表達式匹配內容的最后一個字符的下一個位置;
5. source: 正則表達式的文本字符串,不包括修飾符。
前三條屬性作為正則表達式的修飾符是只讀屬性,不可賦值更改,
關鍵是這個lastIndex 屬性,使用exec或test方法時才被填入,直接反映到正則表達式對象中。
我們回到一開始的那個例子。
用 /\w/g 去匹配字符串 ‘ab’ 的時候,根據屬性的描述,當前表達式匹配內容的最后一個字符的下一個位置(索引)。
把這個定義拆成三句話:
1. 當前表達式匹配內容: 'a' ;
2. 成功匹配內容的最后一個字符: 因為只有一個字符,所以最后一個字符還是 'a' ;
3. 下一個位置:那就是 ’b‘ 。
所以第一次成功匹配后 正則表達式對象的 lastIndex 應該等於 1,然后用代碼驗證一下:
不難得出,正則全文匹配的時候並不是每一次都是從頭開始的,有一個lastIndex屬性記錄了每次匹配開始的位置
到這里文章開頭的問題就迎刃而解了,第三匹配的時候,lastIndex的值為2,而去匹配的字符串中沒有索引為2的字符,自然test方法就返回false,
此時lastIndex會被重置為0,所以第四次的匹配結果又是true了。