国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript 使用正則test( )第一次是 true,第二次是false

2019-11-19 17:27:58
字體:
來源:轉載
供稿:網友

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

第二種是字符串對象的方法,常用方法有四個。

  1. match(regexp) : 找到一個或多個正則表達式的匹配
  2. replace(regexp) : 替換與正則表達式匹配的子串
  3. search(regexp) : 檢索與正則表達式相匹配的值
  4. 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)); //trueconsole.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)); //trueconsole.log(reg.lastIndex);  //reg.lastIndex = 15reg.lastIndex = 0;     //這里我將 lastIndex 重置為 0console.log(reg.test(s2)); //true

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 修武县| 隆回县| 会昌县| 北流市| 吴堡县| 汕头市| 宜阳县| 大洼县| 枣庄市| 惠来县| 来宾市| 安西县| 连城县| 锦州市| 沧源| 左贡县| 磐安县| 临西县| 仙桃市| 岳西县| 蓬莱市| 六枝特区| 舒兰市| 柳江县| 溆浦县| 三台县| 马边| 澎湖县| 宜宾市| 泸西县| 淳化县| 萨嘎县| 河源市| 崇仁县| 阳城县| 明溪县| 鹿邑县| 磐安县| 巴东县| 江孜县| 体育|