1. 程式人生 > >正則表示式最常用的幾種情形

正則表示式最常用的幾種情形

正則表示式提供了一種字串匹配模式的描述形式,通過簡單的符號就能表達豐富的文字結構。如 [a-z]+ 就可以表示所有字母的組合。

以下是在實際專案中使用得最多的三種情形。

1 判斷

如判斷使用者的輸入是否符合要求。通常使用正則表示式的 test 方法,當傳入的字串符合正則表示式的模式要求時會返回 true。

如僅允許輸入數字,可用以下方法檢測:

function checkNum(inputStr){
    return /^\d+$/.test(inputStr);
}

其中正則表示式 ^\d+$ 中,第一個符號 ^ 表示字串首,最後的 $ 表示字串尾,加上這兩個表示必須整串字元完全跟模式匹配才返回 true。而如果沒有,則只要字串中包含符合模式的串就會返回 true。

2 尋找

在文字中尋找指定形式的匹配串,如手機號、郵箱等。在 javascript 中,通常可以使用字串物件的 match 方法。此時,正則表示式作為 match 方法的引數傳入。

如,找出文字中所有的數字串:

function findNum(inputStr){
    return inputStr.match(/\d+/g);
}

// 呼叫示例
console.log( findNum("a123abb90,78a909").join() );

上邊呼叫示例會輸出匹配的陣列資料:123,90,78,909
正則表示式 \d+ 表示數字串,而表示式物件 /\d+/ 外的 g 是一個選項,表示全域性搜尋,表明要找出所有的匹配項。如果沒有這個 g,則只會返回第 1 個匹配結果。

此外,也可以使用正則表示式的 exec 方法,匹配第 1 個符合模式的字串。如 /\d+/.exec("a123abb90,78a909") 得到 123

當然,如果文字中不包括匹配的內容則會返回 null。

3 替換

將文字中符合指定模式的匹配串替換成別的字串,使用字串的 replace 方法。如,將上邊示例字串中的非數字部分替換成逗號,這種情形在對使用者輸入時去除干擾性輸入時經常用到。

function replaceNotNum(inputStr){
    return inputStr.replace(/[^\d]+/g, ",");
}

// 呼叫示例
console.log( replaceNotNum("a123abb90,78a909") );

上邊呼叫示例會輸出結果:,123,90,78,909
同樣,正則表示式後邊的 g 表示全域性,如果沒有它,則只會替換掉第 1 個匹配的字串。

有一種情形是替換時經常碰到的:對匹配的內容不是替換成另一個相同的字串,而是在匹配的基礎上進行調整。如將上邊示例字串中的連續數字統一加上中括號。此時可以:

function decorateNum(inputStr){
    return inputStr.replace(/(\d+)/g, '[$1]');
}

// 呼叫示例
console.log( decorateNum('a123abb90,78a909') );

上邊呼叫示例會輸出結果:a[123]abb[90],[78]a[909]
正則表示式 ([\d]+) 加了括號,而替換的字串中出現了一個$1,這是關鍵。因為替換的內容跟匹配的內容需要動態關聯,需要一種關聯機制。這種機制就是,括號中的內容作為子匹配會進行儲存,以供後續使用,一共支援 $1 ~ $9共 9 個儲存值,這裡再舉一個例子。

function exchangeNum(inputStr){
    return inputStr.replace(/(\d)(\d)/g, '$2$1');
}

猜猜以下呼叫會輸出什麼結果:

console.log( exchangeNum('12 34 56 78') );

4 語法文件

至於想要匹配的內容如何書寫正則表示式,這與需求相關,可以在面臨實際問題時去翻閱語法說明或其它方式尋求答案。

參考文件:https://www.runoob.com/regexp/regexp-tutorial.h