前篇認識了正則表達式基本語法的觀念後,接下來要介紹的是在實戰中常用的幾個用法,使用文字範例如下方假文字:
1 | Lorem ipsum dolor sit amet consectetur |
可使用網路正則表達式網站 regex101 一併實作看看,會更清楚喔!
字元類別 (Character Classes)
. dot 點
除了斷行以外,其他通通都會匹配。
\s match space
除了字符以外,匹配所有空格。
\S match string
除了空格以外,匹配所有字符。
\w 匹配所有文字
效果等同於 [a-zA-Z0-9_]
,但不能選到特殊符號。
\W 除了文字外都匹配
也就是 [^a-zA-Z0-9_]
,\w 的相反效果。
\d 匹配所有數字 0-9
效果等同於[0-9]
。
原範例沒有數字,在最後面加上數字,才匹配得到。
\D 除了數字外都匹配
效果等同於 [^0-9]
,\d 的相反效果。
[a-z] 與 [A-Z] 匹配大小寫
[a-z]
:匹配所有小寫字符,數字與符號除外。[A-Z]
:匹配所有大寫字符,數字與符號除外。[^a-z]
:除了小寫字符外,其他都匹配。[^A-Z]
:除了大寫字符外,其他都匹配。
錨點符號
\b 單字邊界
匹配字符的前後的起末點,除了空白字元與標點符號,以及字串開頭或結尾外,不可再有其他字符。
\B 非單字邊界
\b
的相反效果,也就是原本單字邊界沒有匹配到的,都會匹配到。
常用的特殊字元
- \n 換行字元。
- \0 null 字元。
- . 因為已經是跳脫字元,所以變成一般的點。
- / 反斜線。
\1 Backreference 回參考
匹配對稱的字符。
範例文字如下:
1 | abc=abc, |
$1 替換
主要是把原本的字串替換成要加上的元素。
1 | let str = document.querySelector(".str"); |
點此連結看>>>範例效果
左右合樣 Lookaround
有四種 pattern:
- 右合樣
a(?=b)
- 右不合樣。
a(?!b)
- 左合樣。
(?<=b)a
- 左不合樣。
(?<!a)b
以下方字串為例:
1 | abandon |
用來判斷右(左)邊緊接著的字元是否符合比對條件,如果符合條件才會繼續比對下去。
右合樣、正向肯定預查 Positive Lookahead
如字面所表示,從右邊開始匹配,遇到匹配條件才會成功匹配出結果,否則會跳過。
小括號是群組此匹配條件,問號代表前面的字元可出現 0 到 1 次,匹配條件可有可無,若有只能匹配一次。本次範例匹配條件為在 a 右面要找到 b 才符合匹配條件,並且找到一個 b 就會停止匹配。
右不合樣、正向否定預查 Negative Lookahead
匹配結果會與右合樣相反。
a 後面不是 b 的單字字串都會被匹配出來。
左合樣、反向肯定預查 Positive Lookbehind
從左邊開始匹配,遇到匹配條件才會出現匹配結果,否則會跳過。
要找出 b 左邊有 a 的字串才符合匹配條件,並找到一個 a 就停止匹配。
左不合樣、反向否定預查 Negative Lookbehind
匹配結果與左合樣相反。
左右合樣匹配條件是不佔空間的,所以比對完條件後會再回到字符起點,再比對第二個條件,也是如此特性,如果複雜又沒有寫好的合樣條件,可能演變成無限迴圈而佔用 CPU 資源,
實戰範例
驗證密碼的條件
- 至少有一個數字
- 至少有一個小寫英文字母
- 至少有一個大寫英文字母
- 字串長度在 6 ~ 30 個字母之間
正則可以寫成:^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,30}$
匹配網址
若網址如下:
1 | https://www.google.com |
正則可寫成:https?:\/\/(www\.)?(\w+)(\.\w+)(\.\w+)?
說明:
- 一定會有 http 但不一定會有 S,所以在 s 後面加問號。
- 會有冒號與 // 雙斜線符號。
- www. 群組成為匹配條件,但有可能網址沒有此字串,故使用冒號。
- 取得中間網址所有字串。
- 取得
.
之後所有的字串,也就是.com
,.gov
之類的。 - 最後不一定會有國碼字串,故也選到
.
之後所有字串並且給問號代表選填。
修飾詞 Flags
正則表達式引擎有預設規則,可依照不同設定給予不同的修飾詞改變匹配結果。
g - global search 全域模式
使用全局匹配模式。有時候你會希望重複匹配目標字串多次,使用 g
flag 就可以保留 lastIndex
的狀態,讓下一次再匹配時,可以從 lastIndex
的位置開始找起,你就可以遍歷整個文本中的所有可匹配字串,而不是每一次再匹配時都得到一樣的結果 (文本中從頭開始第一個找到的字串)。另外預設上,如果沒有開啟 g
flag,Regex 引擎只會返回「第一個」匹配到的字串結果。
m - multiline 多行模式
使用多行模式,使 ^
和 $
會比對每一行的開頭與結尾,而不是輸入字串的開頭和結尾。
i - case insensitive 忽略大小寫
使用不區分大小寫的比對方式。
s - singleline 單行模式
使用單行模式,使句點 . 會比對每個字元,而不是換行符號 \n
以外的每個字元
優先權
找中文
正則可以寫:\p{L}