匹配正則_Day233:正則表示式匹配方法 match()
技術標籤:匹配正則
match()語法
match本身是JavaScript語言中字串物件的一個方法,該方法的簽名是
match([string] | [RegExp])
它的引數既可以是一個字串,也可以是一個正則表示式。該方法絕大多數都是要使用正則表示式的,所以引數為string的情況不在本文討論範圍之內。其實引數即使是一個簡單的string,其返回值也跟使用正則表示式的結果無異,而且使用正則表示式的變化比較多,用法複雜,所以我們只討論正則的用法。
一、返回值問題。
我們必須明確的是,這個方法跟其他語言是不同的。JavaScript中的match()方法的返回值是陣列或者是null。如果原字串中匹配到了正則表示式指代的子串,則返回一個數組,否則返回null
二、不使用全域性匹配
var str = 'Today is the 186th day of 2018,I must finish these 2 projects within 21 days.';var results = str.match(/d+/); //只能匹配字串中出現的首個數字,未使用全域性匹配符gconsole.log(results);
輸出的結果是:
再強調一次,這個例子的結果是沒有使用全域性匹配的正則表示式的匹配結果。說白了,就是正則表示式的末尾沒跟g。由於不適用全域性匹配,所以match()方法只找到源字串中首次匹配的子串後,就立刻得到返回結果,不再比較之後剩餘的部分是否還有能匹配上的內容
我們可以看到,match()的結果是一個數組,該陣列一共有4項。各項代表的意思如下:
第0項:匹配到字串
第1項:groups:undefined,這表示當前的正則表示式沒使用分組
第2項:index表示首次匹配上的子串的起始下標。
第3項:input,表示源字串
第4項:length,表示匹配到的結果個數,由於這裡不使用全域性匹配,只找到首次匹配項就結束了,所以匹配結果只有1個,length也就是1。
再次強調下,如果在正則表示式末尾不使用全域性匹配符g,在本例中是無法匹配到所有的數字。反過來說就是,如果想匹配所有的符合條件的子串,就必須在正則的末尾新增全域性匹配符g
三、使用全域性匹配
var str = 'Today is the 186th day of 2018,I must finish these 2 projects within 21 days.';var results = str.match(/d+/g); //匹配所有的數字,使用了全域性匹配符gconsole.log(results);
這次我們在正則表示式的末尾添加了 g,該正則表示式的意圖是,在字串str中匹配出所有的由數字組成的子符串。
這次結果如下:
可以看到,這次的返回值仍然是個陣列,只不過這個陣列的內容跟上邊不使用全域性匹配時大不相同的。由於原字串中出現了4個數字組成的子串的情況,所以該陣列中出現了4個項。length屬性同樣為匹配到的結果個數,這裡顯然是4個。
仔細看會發現,此時返回的陣列中,沒有index,input這2項,不過這兩項並不十分重要。
四、使用分組
使用分組時的情況比較麻煩,還要看有沒有使用全域性匹配,也就是有沒有在正則表示式的末尾新增g
4.1 使用分組,且不使用g
var str = 'Today is the 286th day of 2018, the 108th Thanksgiving Day.';var results = str.match(/d+(th)/); //匹配str中首個以數字開頭,並且以th結尾的子串console.log(results);
輸出結果是:
由於該正則表示式為: /d+ (th) /,該表示式中使用了小括號(),在此處的作用為分組。所以match()的結果是帶有分組特徵的。返回的陣列包含多個元素,第一個元素是以貪婪模式找到的最長的匹配,之後的元素依次為該匹配中的第一、第二、第三 ......個分組,這裡只有1個分組,所以也就只匹配到1個分組結果,也就是”th"。
假如正則表示式改成:/d+(t)(h)/,那麼匹配到的項就有3個,分別是 : '286th' 、 't' 、'h'。我相信大家看到這裡,對於分組的意義,以及如何匹配分組就已經瞭解了。
陣列中其它項不再解釋了,參考上邊的。
需要注意的是,這種結果是前提是:1.使用分組,2.不做全域性匹配。
4.2 使用分組,同時使用全域性匹配g
var str = 'Today is the 286th day of 2018, the 108th Thanksgiving Day.';var results = str.match(/d+(th)/g); //匹配str中所有的以數字開頭,並且以th結尾的子串console.log(results);
這次的程式碼,跟上次的程式碼區別只有一點,就是正則表示式末尾多了個g,表示全域性匹配。
結果也是大不相同的。
結果說明了一切,當正則中使用全域性匹配符g,即使有分組的存在,在匹配結果中也只有匹配到的最長的,那些分組的子匹配都不見了。
具體表現為:這次匹配到的結果是 ’286th‘ 和 ‘’108th’ ,前一個例子中使用分組是出線的那個單獨的分組子匹配 ‘th’,這一項不見了。我們把這個現象理解為,只要使用了全域性匹配模式,那麼match()將只返回“貪婪”的匹配結果,這裡的“貪婪”指的就是隻招那個最長的能匹配上的字串,至於分組項,就忽略了。
原文:https://www.cnblogs.com/ldq678/p/9375305.html