字串搜尋匹配之match&&exec
阿新 • • 發佈:2018-12-03
這裡討論的是字串搜尋匹配時常用的另外兩個API: match exec
- str.match(reg)
如果傳入的引數reg不是一個正則表示式物件,而是字串,那麼這裡會和search函式一樣通過new RegExp(str)將其隱式轉換成正則表示式。
var str = '#home#home'
var reg1 = 'home'
var match1 = str.match(reg1)
與下面程式碼得到的match2結果一樣:
var str = '#home#home' var reg2 = /home/ var match2 = str.match(reg2)
注意這裡的正則表示式並不包含全域性標誌g,如果包含的話,得到的結果為:
var str = '#home#home'
var reg3 = /home/g
var match3 = str.match(reg3)
所以說,如果想要知道一個元素在字串中出現的次數,可以用match全域性匹配,得到陣列的長度就是出現的次數。
以上3例都是匹配成功的例子,如果匹配不成功,則返回null
var str = '#home#home'
var reg4 = /home1/g
var match4 = str.match(reg4) //match4的結果為null
如果匹配規則為空,即沒有給match方法傳入引數,或者傳入空字串(’’)則返回結果為第一項為空字串的陣列
var str = '#home#home'
var match4 = str.match()
結果為:
如果正則表示式中包含捕獲組,且沒有全域性匹配標誌g,那麼:
var str = '#home#home'
var reg5 = /(#)home/
var match5 = str.match(reg5)
得到的陣列第二個元素是捕獲組捕獲到的結果:
如果包含捕獲組,但是同時也設定了全域性標誌,那麼捕獲組會被忽略
var str = '#home#home' var reg6 = /(#)home/g var match6 = str.match(reg6)
得到的結果為:
總結:使用match方法主要一是可以使用全域性標誌g來獲取一個元素在str中出現的次數,二是可以通過捕獲組來獲取子匹配(不能有全域性標誌g),其他的功能search方法也可以實現,詳見我的另一篇博文:字串搜尋匹配之 test&search&indexOf
- reg.exec(str)
reg必須是正則物件,無論正則表示式中是否有全域性標誌g,均可以獲得和match方法不帶全域性標誌g一樣的結果,都是返回第一次匹配的結果。
var str = '#home#home'
var reg1 = /(#)home/
var reg2 = /(#)home/g
var match1 = reg1.exec(str)
var match2 = reg2.exec(str)
得到的結果均為:
這裡要注意的一點是,正則表示式帶和不帶全域性標誌g在匹配時的不同點在於:帶全域性標誌g每次匹配後,匹配位置(lastIndex)變成下次匹配的起始位置。
如果沒有匹配到結果,跟match方法一樣,返回null
var str = '#home#home'
var reg3 = /(#)home1/
var match3 = reg3.exec(str) //match3結果為null
總結:使用exec方法要注意的是如果設定了全域性標誌g,則每次的匹配位置lastIndex會改變。