正則表達式最常用的幾種情形
- 2019 年 10 月 3 日
- 筆記
正則表達式提供了一種字元串匹配模式的描述形式,通過簡單的符號就能表達豐富的文本結構。如
[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.html
