首頁  >  文章  >  web前端  >  深入理解JS正規表示式之test方法及其陷阱

深入理解JS正規表示式之test方法及其陷阱

不言
不言原創
2018-07-11 09:55:412283瀏覽

這篇文章主要介紹了關於深入理解JS正規表示式之test方法及其陷阱,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

test方法

test方法介紹

RegExp.prototype.test(str)

test方法用於測試字串參數中是否存在符合正規表示式模式的字串

test方法的使用

let reg = /\w/

reg.test('a')       // true

reg.test('$')       // false

透過結果可以看出,如果測試字串參數存在符合正規表示式模式的字串則傳回true,否則傳回false

test方法的那些坑

當正規表示式使用了全域匹配時,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方法本身就是用來測試是否存在匹配正則的字串,不使用全域模式一樣可以實現目的,所以第一種方法就是不適用全域模式。

第二種方法:不將正規物件實例存在變數中,每次直接用正規物件實例呼叫test方法,不過這種方法對記憶體有所損耗,理論上不建議。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

深入理解JS正規表示式之REGEXP物件屬性的解析

#深入理解JS正規表示式之分組的解析

深入理解JS正規表示式之貪婪模式與非貪婪模式的解析
##

以上是深入理解JS正規表示式之test方法及其陷阱的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn