摘要:最近在使用正則匹配的時候,我遇到一個非常有意思的現象,代碼如下所示這段代碼很好理解它的規則就是判斷字符串中是否含有,然后再循環地和數組中的字符串進行匹配,打印出結果。
最近在使用正則匹配的時候,我遇到一個非常有意思的現象,代碼如下所示:
const reg = /.jpg/g; const arr = [ "test1.jpg", "test2.jpg", "test3.jpg", "test4.jpg", "test5.jpg", ]; arr.map(item => console.log(reg.test(item)));
這段代碼很好理解:它的規則就是判斷字符串中是否含有.jpg,然后再循環地和數組中的字符串進行匹配,打印出結果。
很顯然這非常之簡單嘛,輸出的結果當然是全為true啦~
然而,圖樣圖森破,它的結果是這樣的:
代碼的執行結果非常神奇:它并沒有全部打印true,而是交替打印true和false值,這到底是為什么?
為了查清楚到底是怎么回事,我開始上網搜索相關資料,經過一番搜索后,發現正則并沒有我們想象的那么簡單...
首先正則有一個屬性叫lastIndex,它表示正則下一次匹配時的起始位置。一般情況下我們是使用不到它的,但在正則中包含全局標志g時,正則的test和exec方法就會使用到它,具體規則如下:
初始狀態下lastIndex的值為0
若成功匹配,lastIndex的值就被更新成被匹配字符串后面的第一個字符的index,或者可理解為被匹配字符串的最后一個字符index + 1,
若匹配失敗,lastIndex則被重置為0。
如果我們繼續使用原先的正則進行下一輪匹配,它則會從字符串lastIndex的位置開始進行
為驗證這個結論,我特意做了兩個實驗:
第一個就是直接將正則的lastIndex打印出來:
const reg = /.jpg/g; const arr = [ "test1.jpg", "test2.jpg", "test3.jpg", "test4.jpg", "test5.jpg", ]; arr.map(item => console.log(reg.test(item), reg.lastIndex));
第二個就對數組中的字符串稍作修改:
const reg = /.jpg/g; const arr = [ "test1.jpg", "longTest4.jpg", "test3.jpg", "longTest4.jpg", "test5.jpg", ]; arr.map(item => console.log(reg.test(item), reg.lastIndex));
通過兩組實驗的對比觀察,發現確實如此:
在第一個實驗中,由于數組中字符串的長度都是一致的,成功匹配后lastIndex的值直接更新為9,下次匹配的時候直接從第10個字符開始(很明顯根本就沒第10個字符嘛),因此匹配失敗,lastIndex重置為0。以此類推,最終以9、0、9的形式交替打印。
而第二個實驗由于我們增加了部分字符串的長度,因此對于第2、4個字符串而言,即使從第9個字符開始匹配,依然能匹配到后邊的.jpg,故lastIndex繼續更新到13
通過這次小小的實驗,我們發現使用正則的時候還是要多加小心,對于test和exec方法,最好還是不要隨意加上全局標志g。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97682.html
摘要:返回是一個只讀的布爾值,看這個正則表達式是否帶有修飾符。方法,它的參數是一個字符串,用對某個字符串進行檢測,如果包含正則表達式的一個匹配結果,則返回,否則返回。總結這次主要是說說,中正則表達式對象的個屬性,而最需要注意的就是屬性了。 說明 這篇文章,主要和大家聊聊JavaScript中RegExp對象的屬性。 解釋 每個RegExp對象都包含5個屬性,source、global、ign...
摘要:返回是一個只讀的布爾值,看這個正則表達式是否帶有修飾符。方法,它的參數是一個字符串,用對某個字符串進行檢測,如果包含正則表達式的一個匹配結果,則返回,否則返回。總結這次主要是說說,中正則表達式對象的個屬性,而最需要注意的就是屬性了。 說明 這篇文章,主要和大家聊聊JavaScript中RegExp對象的屬性。 解釋 每個RegExp對象都包含5個屬性,source、global、ign...
摘要:返回是一個只讀的布爾值,看這個正則表達式是否帶有修飾符。方法,它的參數是一個字符串,用對某個字符串進行檢測,如果包含正則表達式的一個匹配結果,則返回,否則返回。總結這次主要是說說,中正則表達式對象的個屬性,而最需要注意的就是屬性了。 說明 這篇文章,主要和大家聊聊JavaScript中RegExp對象的屬性。 解釋 每個RegExp對象都包含5個屬性,source、global、ign...
摘要:等價于實例屬性正則對象的實例屬性分成兩類。返回一個布爾值,表示是否設置了修飾符。字符串對象的方法,返回第一個滿足條件的匹配結果在整個字符串中的位置。字符串對象的方法按照正則規則分割字符串,返回一個由分割后的各個部分組成的數組。 概述實例屬性實例方法RegExp.prototype.test()g RegExp.prototype.exec()g括號indexx input屬性字符串的實...
閱讀 1091·2021-11-15 18:00
閱讀 2803·2021-09-22 15:18
閱讀 1965·2021-09-04 16:45
閱讀 750·2019-08-30 15:55
閱讀 3853·2019-08-30 13:10
閱讀 1332·2019-08-30 11:06
閱讀 1984·2019-08-29 12:51
閱讀 2294·2019-08-26 13:55