1. 程式人生 > >字串搜尋匹配之match&&exec

字串搜尋匹配之match&&exec

這裡討論的是字串搜尋匹配時常用的另外兩個API: match exec

  1. 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

  1. 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會改變。