正規表示式提供了一種字串匹配模式的描述形式,通過簡單的符號就能表達豐富的文字結構。如
[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 語法文件
至於想要匹配的內容如何書寫正規表示式,這與需求相關,可以在面臨實際問題時去翻閱語法說明或其它方式尋求答案。