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
目前想到的就這三種,後面有想到其它的再來補吧;
相關文章
- js Abba逆向前瞻正則匹配例項JS
- js中split之正則運用(模式匹配)JS模式
- 探究js正則匹配方法:match和execJS
- 正則匹配規則2
- python的re正則匹配Python
- 正規表示式全域性匹配模式(g修飾符)模式
- 正規表示式g全域性匹配識別符號符號
- 正則匹配規則記錄
- PHP 正則匹配中文PHP
- 正則匹配數字
- Python正則匹配中文Python
- grep 多行 正則匹配
- apisix~路由字首的正則匹配API路由
- 正則匹配的捕獲組
- 研發效能度量引發的血案
- Logstash之Grok正則匹配,讓正則進階!
- 由Ghost漏洞引發的“血案”
- RestTemplate超時引發的血案REST
- JDBC亂碼引發的"血案"JDBC
- Laravel redis 正則匹配keysLaravelRedis
- 正則匹配指定字元之前的字串字元字串
- 開發小技巧之:unicode的排序和正則匹配Unicode排序
- Java處理正則匹配卡死(正則回溯問題)Java
- 【小技巧】巧用CSS屬性值正則匹配選擇器CSS
- js表情正則 手機正則 郵箱正則JS
- 一個 List.of 引發的“血案”
- Flutter 中由 BuildContext 引發的血案FlutterUIContext
- vue watch陣列引發的血案Vue陣列
- async,await與forEach引發的血案AI
- java中url正則regex匹配Java
- 正則匹配方法及示例
- VIM-灰常有用的正則匹配
- shell正則匹配捕獲引用進行IP匹配
- io.Reader遊標引發的血案
- Maven依賴版本號引發的血案Maven
- 一個map函式引發的血案函式
- 一個UPDATE語句引發的血案
- 正則特殊引數