javascript 使用正則test( )第一次是 true,第二次是false
1.前言
今天朋友問我一個(gè)問題,我現(xiàn)在需要多次匹配同一個(gè)內(nèi)容,但是為什么我第一次匹配,直接是 true,而第二次匹配確實(shí) false 呢?
var s1 = "MRLP"; var s2 = "MRLP"; var reg = /mrlp/ig; console.log(reg.test(s1)); console.log(reg.test(s2));
這時(shí)候你會(huì)發(fā)現(xiàn),我們?cè)谶B續(xù)使用一個(gè)正則匹配其他字符串的時(shí)候,第一次匹配是 true,而第二次匹配則是 false。
等等,WHT?我匹配的是 MRLP,而且我還特意加上i 用于不區(qū)分大小寫,可以為什么第一次可以正常匹配,第二次就不行了呢?
這也就是我今天要跟大家說的,關(guān)于 JS 中的 lastIndex。
2. lastIndex
在開始講解之前,首先先帶大家簡(jiǎn)單回顧一下 JS中正則表達(dá)式的使用方式。
JS 中正則表達(dá)式的使用方式有兩種:
第一種是正則表達(dá)式對(duì)象的方法,常用方法有兩個(gè)。
- exec(str) : 檢索字符串中指定的值。返回找到的值,并確定其位置
- test(str) : 檢索字符串中指定的值。返回 true 或 false
第二種是字符串對(duì)象的方法,常用方法有四個(gè)。
- match(regexp) : 找到一個(gè)或多個(gè)正則表達(dá)式的匹配
- replace(regexp) : 替換與正則表達(dá)式匹配的子串
- search(regexp) : 檢索與正則表達(dá)式相匹配的值
- split(search) : 把字符串分割為字符串?dāng)?shù)組
而這些方法和咱們今天所說的 lastIndex 有什么關(guān)系呢?
lastIndex 屬性用于規(guī)定下次匹配的起始位置。
上次匹配的結(jié)果是由方法 RegExp.exec( ) 和 RegExp.test( ) 找到的,它們都以 lastIndex 屬性所指的位置作為下次檢索的起始點(diǎn)。
這樣,就可以通過反復(fù)調(diào)用這兩個(gè)方法來遍歷一個(gè)字符串中的所有匹配文本。
而且需要注意,該屬性只有設(shè)置標(biāo)志 g才能使用。
既然已經(jīng)知道這個(gè)東西的形成原因,那么解決起來就非常簡(jiǎn)單了。
3.解決方案
3.1 第一種解決方案
如上面所述,我們 lastIndex 屬性必須要設(shè)置 g 標(biāo)簽才能使用。
那么我們?cè)谄ヅ涞臅r(shí)候,可以根據(jù)情況,直接去掉 g 標(biāo)簽就可以啦。
var s1 = "MRLP"; var s2 = "MRLP"; var reg = /mrlp/i; console.log(reg.test(s1)); //true console.log(reg.test(s2)); //true
3.2 第二種解決方案
很多時(shí)候,我們必須要執(zhí)行 全局匹配( g ),這時(shí)候就不能使用第一種方案了。
其實(shí),我們的lastIndex 屬性是可讀可寫的。
只要目標(biāo)字符串的下一次搜索開始,就可以對(duì)它進(jìn)行設(shè)置。
當(dāng)方法 exec() 或 test() 再也找不到可以匹配的文本時(shí),它們會(huì)自動(dòng)把 lastIndex 屬性重置為 0。
這樣,我們?cè)俅螆?zhí)行全局匹配的時(shí)候,就不會(huì)出現(xiàn) false 的情況了。
var s1 = "3206064928:MRLP:3206064928"; var s2 = "MRLP"; var reg = /mrlp/ig; console.log(reg.test(s1)); //true console.log(reg.lastIndex); //reg.lastIndex = 15 reg.lastIndex = 0; //這里我將 lastIndex 重置為 0 console.log(reg.test(s2)); //true
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
一文讀懂JS中的var/let/const和暫時(shí)性死區(qū)
這篇文章主要為大家詳細(xì)介紹了JavaScript中的var、let、const和暫時(shí)性死區(qū)的異同,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02js簡(jiǎn)單正則驗(yàn)證漢字英文及下劃線的方法
這篇文章主要介紹了js簡(jiǎn)單正則驗(yàn)證漢字英文及下劃線的方法,結(jié)合完整實(shí)例形式分析了javascript針對(duì)中英文字母與下劃線的正則驗(yàn)證方法,需要的朋友可以參考下2016-11-11使用canvas及js簡(jiǎn)單生成驗(yàn)證碼方法
在很多時(shí)候都需要用到驗(yàn)證碼,前端驗(yàn)證碼需要知道Html5中的canvas知識(shí)點(diǎn)。驗(yàn)證碼生成步驟是:1.生成一張畫布canvas 2.生成隨機(jī)數(shù)驗(yàn)證碼 3.在畫布中生成干擾線 4.把驗(yàn)證碼文本填充到畫布中 5.點(diǎn)擊畫布更換驗(yàn)證碼2017-04-04JavaScript延遲加載之a(chǎn)sync與defer的應(yīng)用
這篇文章主要介紹了JavaScript延遲加載之a(chǎn)sync與defer的應(yīng)用場(chǎng)景與使用區(qū)別的介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09淺析C/C++,Java,PHP,JavaScript,Json數(shù)組、對(duì)象賦值時(shí)最后一個(gè)元素后面是否可以帶逗號(hào)
這篇文章主要介紹了淺析C/C++,Java,PHP,JavaScript,Json數(shù)組、對(duì)象賦值時(shí)最后一個(gè)元素后面是否可以帶逗號(hào)的相關(guān)資料,需要的朋友可以參考下2016-03-03tablesorter.js表格排序使用方法(支持中文排序)
這篇文章主要為大家詳細(xì)介紹了tablesorter.js表格排序使用方法,支持中文排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02js 父窗口控制子窗口的行為-打開,關(guān)閉,重定位,回復(fù)
技術(shù)要點(diǎn)可以利用windows的open和closed來對(duì)子窗口的控制,需要父窗口和子窗口之間進(jìn)行互動(dòng)。2010-04-04