這篇文章主要介紹了關於深入理解JS正規表示式之test方法及其陷阱,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
RegExp.prototype.test(str)
test方法用於測試字串參數中是否存在符合正規表示式模式的字串
let reg = /\w/ reg.test('a') // true reg.test('$') // false
透過結果可以看出,如果測試字串參數存在符合正規表示式模式的字串則傳回true,否則傳回false
當正規表示式使用了全域匹配時,test方法會出現如下的這種奇怪現象:
let reg = /\w/g reg.test('ab') // true reg.test('ab') // true reg.test('ab') // false reg.test('ab') // true
可以看到,每輪的第三次匹配返回會變成true,但是,ab
不是都符合reg嗎,回傳都應該回傳true才對。原因就在於上一節提到的lastIndex屬性。
我們可以試試每次都執行test方法都打出reg的lastIndex方法:
let reg = /\w/g reg.lastIndex // 0 reg.test('ab') // true reg.lastIndex // 1 reg.test('ab') // true reg.lastIndex // 2 reg.test('ab') // false reg.lastIndex // 0 reg.test('ab') // true reg.lastIndex // 1
看看結果,然後回想下lastIndex的定義,你就明白原因了。
lastIndex屬性是目前表達式符合內容的最後一個字元的後一位,用於規定下一次符合的起始位置。
當進入正規表示式全域模式時,每次使用test方法都會從lastIndex開始,並匹配從lastIndex開始的子字串。例如例子中,第二次執行test方法時,此時,lastIndex已經變成2,子字串為空,所以reg不可能比對上它。由於子字串比對失敗,test方法傳回false,並將lastIndex屬性置為0,重新開始一輪迴圈。
第一種方法:test方法本身就是用來測試是否存在匹配正則的字串,不使用全域模式一樣可以實現目的,所以第一種方法就是不適用全域模式。
第二種方法:不將正規物件實例存在變數中,每次直接用正規物件實例呼叫test方法,不過這種方法對記憶體有所損耗,理論上不建議。
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!
相關推薦:
以上是深入理解JS正規表示式之test方法及其陷阱的詳細內容。更多資訊請關注PHP中文網其他相關文章!