分組 在使用正則的時候,有時候會想要匹配一串字元串連續出現多次的情況,比如:我想匹配字元串 連續出現3次的情況。 有些人會直接寫: 但是,這種情況僅僅會匹配 加上三個 ,顯然,這樣是錯誤的。 要想實現之前的需求,我們需要使用正則表達式的分組功能:使用 可以達到分組的功能,使量詞作用於分組。所以,如下 ...
分組
在使用正則的時候,有時候會想要匹配一串字元串連續出現多次的情況,比如:我想匹配字元串Byron
連續出現3次的情況。
有些人會直接寫:
Byron{3}
但是,這種情況僅僅會匹配Byro
加上三個n
,顯然,這樣是錯誤的。
要想實現之前的需求,我們需要使用正則表達式的分組功能:使用()
可以達到分組的功能,使量詞作用於分組。所以,如下正則可以順利匹配Byron
三次
(Byron){3}
或
JS中的|
的含義是或,在正則中,我們也可以使用|
達成或的效果。比較常用的或的寫法是:
Byron | Casper
即,Byron或Casper二選一。
還有一種用法是配合分組使用:
let text = 'ByronsperByrCasper'
let reg = /Byr(on|Ca)sper/g // 匹配Byronsper或ByrCasper
text.replace(reg, 'X') // XX
反向引用
此時,我們有一個需求,將一種格式的時間字元串:yyyy-MM-DD
轉為MM/DD/yyyy
類型格式字元串。
這個問題的難點在於,不僅要將-
轉為/
還要將年月日的位置進行調換。由於年月日的數值是不固定的,沒法直接轉換為固定數值。這時,我們可以使用反向引用解決這個問題。
反向引用是分組中的一個重要的高級語法,主要用來解決分組變數的問題。
什麼叫分組變數?分組變數就是通過分組匹配到的值,正則表達式將其轉為了一種可以被調用的變數。而調用這個變數也很簡單$n
n代表著分組的序號,值得一提的是,序號是從1開始,而不是從0開始。
通過反向引用可以很輕鬆的解決上面那個問題:
let text = '2018-07-09'
let reg = /(\d{4})-(\d{2})-(\d{2})/g
/*
$1是(\d{4})的匹配內容,代表yyyy
$2是第一個(\d{2})的匹配內容,代表MM
$3是第二個(\d{2})的匹配匹配內容,代表DD
*/
text.replace(reg, '$2/$3/$1') // 07/09/8
忽略分組
當不希望捕獲某些分組,只需要在分組內加上?:
即可以
(?:Byron).(ok)