1. 程式人生 > >JS46 JS中的match和exec方法

JS46 JS中的match和exec方法

關於reg.execstring.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...]