JS46 JS中的match和exec方法
阿新 • • 發佈:2018-11-10
關於reg.exec
和string.match
方法
exec
是RegExp物件的方法,引數才是字串,match
是字串執行匹配正則表示式規則的方法,引數是正則表達,返回的都是陣列;
在正則表示式沒有全域性標誌g
時,二者的返回值是相同的
- 正則表示式中沒有捕獲組時,返回值是隻有一個成員的陣列,第一項是從起始位置開始尋找的第一個匹配項,無論執行多少次都是相同的(從位置0開始)
- 正則表示式中有捕獲組時,返回值是一個數組,第一項是從起始位置開始尋找的第一個匹配項,後續是匹配的捕獲組,無論執行多少次都是相同的(從位置0開始)
const text = 'cat, bat';
let pattern = /.at/
pattern.exec (text)
// ["cat"]
pattern.exec(text)
// ["cat"]
text.match(pattern)
// ["cat"]
text.match(pattern)
// ["cat"]
let pattern2 = /.(at)/
pattern2.exec(text)
// ["cat", "at"]
pattern2.exec(text)
// ["cat", "at"]
在正則表示式含有全域性標誌g
時,二者的返回值不同
- 正則表示式中沒有捕獲組的時候
match
方法返回的陣列成員是所有符合條件的匹配項,陣列第一個成員存放第一個匹配項,陣列第而個成員存放第二個匹配項…依次類推。無論執行多少次返回結果相同exec
方法永遠返回值是隻有一個成員的陣列,第一項是第一個匹配項。但是當連續呼叫exec時,則每次的返回值都是在現有位置繼續尋找的下一個匹配項。
let pattern3 = /.at/g
text.match(pattern3)
// ["cat", "bat"]
text.match(pattern3)
// ["cat", "bat"]
pattern3.exec(text)
// ["cat"]
pattern3.exec(text)
// ["bat"]
- 正則表示式有捕獲組的時候
match
返回值與沒有捕獲組時相同,返回的陣列由匹配項組成exec
返回值與沒有g的捕獲組正則表示式相同,第一項是從起始位置開始尋找的第一個匹配項,後續是匹配的捕獲組,但如果執行多次返回值都是在現有基礎上繼續尋找的
let pattern4 = /.(at)/g
text.match(pattern4)
// ["cat", "bat"]
text.match(pattern4)
// ["cat", "bat"]
pattern4.exec(text)
// ["cat", "at"]
pattern4.exec(text)
// ["bat", "at"]
總結
總結一下:(g代表全域性標誌,捕代表捕獲組,每種情況的用→
連線的多個數組代表執行多次的結果)
對於match
方法,是字串的方法,返回值是陣列
- 有g無捕:
[匹配1, 匹配2, ...]
→[匹配1, 匹配2, ...]
- 有g有捕:
[匹配1, 匹配2, ...]
→[匹配1, 匹配2, ...]
- 無g無捕:
[匹配1]
→[匹配1]
- 無g有捕:
[匹配1, 捕獲1-1, 捕獲1-2...]
→[匹配1, 捕獲1-1, 捕獲1-2...]
對於exec
方法,是RegExp物件的方法,返回值是陣列
- 有g無捕:
[匹配1]
→[匹配2]
- 有g有捕:
[匹配1, 捕獲1-1, 捕獲1-2...]
→[匹配2, 捕獲2-1, 捕獲2-2...]
- 無g無捕:
[匹配1]
→[匹配1]
- 無g有捕:
[匹配1, 捕獲1-1, 捕獲1-2...]
→[匹配1, 捕獲1-1, 捕獲1-2...]