當用正則匹配一個字符串時,第一次是true,第二次是false,循環往復
最終結論:
用test、exec時去掉全局匹配g,match、replace、search、split等不影響
JS中正則表達式的使用方式。
JS 中正則表達式的使用方式有兩種:
第一種是正則表達式對象的方法,常用方法有兩個。
- exec(str) : 檢索字符串中指定的值。返回找到的值,並確定其位置
- test(str) : 檢索字符串中指定的值。返回 true 或 false
第二種是字符串對象的方法,常用方法有四個。
- match(regexp) : 找到一個或多個正則表達式的匹配
- replace(regexp) : 替換與正則表達式匹配的子串
- search(regexp) : 檢索與正則表達式相匹配的值
- split(search) : 把字符串分割為字符串數組
而這些方法和咱們今天所說的 lastIndex 有什么關系呢?
在設置為 g 標志時使用 RegExp.test() 和 RegExp.exec() 兩個方法進行匹配時(我是使用 g 標志的),兩者會根據自身的 lastIndex 屬性所指向的位置作為下次匹配的開始點,一旦RegExp匹配過一次之后,lastIndex 屬性會變更,這時候再次使用此RegExp匹配值時則會返回 false 。
來源:https://blog.csdn.net/weixin_42995152/article/details/104174402
lastIndex 屬性用於規定下次匹配的起始位置。
上次匹配的結果是由方法 RegExp.exec( ) 和 RegExp.test( ) 找到的,它們都以 lastIndex 屬性所指的位置作為下次檢索的起始點。
這樣,就可以通過反復調用這兩個方法來遍歷一個字符串中的所有匹配文本。
而且需要注意,
該屬性只有設置標志 g才能使用。
既然已經知道這個東西的形成原因,那么解決起來就非常簡單了。
3.解決方案
3.1 第一種解決方案
如上面所述,我們 lastIndex 屬性必須要設置 g 標簽才能使用。
那么我們在匹配的時候,可以根據情況,直接去掉 g 標簽就可以啦。
3.2 第二種解決方案
很多時候,我們必須要執行 全局匹配( g ),這時候就不能使用第一種方案了。
其實,我們的lastIndex 屬性是可讀可寫的。
只要目標字符串的下一次搜索開始,就可以對它進行設置。
當方法 exec() 或 test() 再也找不到可以匹配的文本時,它們會自動把 lastIndex 屬性重置為 0。
這樣,我們再次執行全局匹配的時候,就不會出現 false 的情況了。
參考:https://www.jb51.cc/js/41414.html