js正則全域性匹配引發的血案
現象
-
下面這個程式碼的輸出毫無疑問,是true;
const reg = /\d+/g; //匹配數字 reg.test(11111); // true
-
如果我接著再test一遍呢
const reg = /\d+/g; //匹配數字 reg.test(11111); // true reg.test(11111); // false
這就是血案本案了
-
lastIndex觀察
const reg = /\d+/g; //匹配數字 console.log(reg.test(11111), reg.lastIndex); // true, 0 console.log(reg.test(11111), reg.lastIndex); // false, 5 console.log(reg.test(11111), reg.lastIndex); // true, 0 console.log(reg.test(11111), reg.lastIndex); // false, 5 console.log(reg.test(11111), reg.lastIndex); // true, 0 console.log(reg.test(11111), reg.lastIndex); // false, 5
-
MDN中對於exec和test有如下介紹
在設定了 global 或 sticky 標誌位的情況下(如 /foo/g or /foo/y),JavaScript RegExp 物件是有狀態的。他們會將上次成功匹配後的位置記錄在 lastIndex 屬性中
-
處理方案1
避免在test時使用g(廢話); -
處理方案2
每次test建立新的正則物件 :/\d/g.test(11111) // true /\d/g.test(11111) // true /\d/g.test(11111) // true /\d/g.test(11111) // true
這其實也不太好,每次都例項化出一個新的正則物件;
-
處理方案3
lastIndex是可寫的!!
那就可以這樣了:const reg = /\d+/g; //匹配數字 reg.test(11111); // true reg.lastIndex = 0; reg.test(11111); // true
目前想到的就這三種,後面有想到其它的再來補吧;
相關文章
- 正則匹配規則2
- 正規表示式全域性匹配模式(g修飾符)模式
- 正規表示式g全域性匹配識別符號符號
- 探究js正則匹配方法:match和execJS
- js中split之正則運用(模式匹配)JS模式
- js Abba逆向前瞻正則匹配例項JS
- PHP 正則匹配中文PHP
- .Net版本引發的血案
- python的re正則匹配Python
- oracle10g的正則規則匹配Oracle
- Python正則匹配中文Python
- RestTemplate超時引發的血案REST
- JDBC亂碼引發的"血案"JDBC
- SwipeRefreshLayout 引發的一場血案
- 正則匹配指定字元之前的字串字元字串
- Logstash之Grok正則匹配,讓正則進階!
- Java處理正則匹配卡死(正則回溯問題)Java
- 【小技巧】巧用CSS屬性值正則匹配選擇器CSS
- 在專案開發中經常用到的全域性函式、正則(持續更新)函式
- 開發小技巧之:unicode的排序和正則匹配Unicode排序
- Laravel redis 正則匹配keysLaravelRedis
- 正則匹配方法及示例
- 07 nginx Location之正則匹配Nginx
- vue watch陣列引發的血案Vue陣列
- _nop_()函式引發的血案函式
- maxp = maxp.replace("\$","").replace(/_/g,""); js 正則全欄位匹配JS
- iOS擷取特定的字串(正則匹配)iOS字串
- VIM-灰常有用的正則匹配
- shell正則匹配捕獲引用進行IP匹配
- js表情正則 手機正則 郵箱正則JS
- Flutter 中由 BuildContext 引發的血案FlutterUIContext
- Maven依賴版本號引發的血案Maven
- 一個 Handler 面試題引發的血案!!!面試題
- 一個map函式引發的血案函式
- 一道面試題引發的“血案”面試題
- java中url正則regex匹配Java
- php正則匹配所有違規字元PHP字元
- Linux篇---Grep和正則匹配Linux