您好,登錄后才能下訂單哦!
小編給大家分享一下javascript中使用正則test( )第一次是true,第二次是false的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
1.前言
朋友問我一個問題,我現在需要多次匹配同一個內容,但是為什么我第一次匹配,直接是 true,而第二次匹配確實 false 呢?
var s1 = "MRLP"; var s2 = "MRLP"; var reg = /mrlp/ig; console.log(reg.test(s1)); console.log(reg.test(s2));
這時候你會發現,我們在連續使用一個正則匹配其他字符串的時候,第一次匹配是 true,而第二次匹配則是 false。
等等,WHT?我匹配的是 MRLP,而且我還特意加上i 用于不區分大小寫,可以為什么第一次可以正常匹配,第二次就不行了呢?
這也就是我今天要跟大家說的,關于 JS 中的 lastIndex。
2. lastIndex
在開始講解之前,首先先帶大家簡單回顧一下 JS中正則表達式的使用方式。
JS 中正則表達式的使用方式有兩種:
第一種是正則表達式對象的方法,常用方法有兩個。
exec(str) : 檢索字符串中指定的值。返回找到的值,并確定其位置
test(str) : 檢索字符串中指定的值。返回 true 或 false
第二種是字符串對象的方法,常用方法有四個。
match(regexp) : 找到一個或多個正則表達式的匹配
replace(regexp) : 替換與正則表達式匹配的子串
search(regexp) : 檢索與正則表達式相匹配的值
split(search) : 把字符串分割為字符串數組
而這些方法和咱們今天所說的 lastIndex 有什么關系呢?
lastIndex 屬性用于規定下次匹配的起始位置。
上次匹配的結果是由方法 RegExp.exec( ) 和 RegExp.test( ) 找到的,它們都以 lastIndex 屬性所指的位置作為下次檢索的起始點。
這樣,就可以通過反復調用這兩個方法來遍歷一個字符串中的所有匹配文本。
而且需要注意,該屬性只有設置標志 g才能使用。
既然已經知道這個東西的形成原因,那么解決起來就非常簡單了。
3.解決方案
3.1 第一種解決方案
如上面所述,我們 lastIndex 屬性必須要設置 g 標簽才能使用。
那么我們在匹配的時候,可以根據情況,直接去掉 g 標簽就可以啦。
var s1 = "MRLP"; var s2 = "MRLP"; var reg = /mrlp/i; console.log(reg.test(s1)); //true console.log(reg.test(s2)); //true
3.2 第二種解決方案
很多時候,我們必須要執行 全局匹配( g ),這時候就不能使用第一種方案了。
其實,我們的lastIndex 屬性是可讀可寫的。
只要目標字符串的下一次搜索開始,就可以對它進行設置。
當方法 exec() 或 test() 再也找不到可以匹配的文本時,它們會自動把 lastIndex 屬性重置為 0。
這樣,我們再次執行全局匹配的時候,就不會出現 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
以上是“javascript中使用正則test( )第一次是true,第二次是false的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。