0%

Regular Expression 正則表達式 - 進階用法

前篇認識了正則表達式基本語法的觀念後,接下來要介紹的是在實戰中常用的幾個用法,使用文字範例如下方假文字:

1
2
3
4
5
Lorem ipsum dolor sit amet consectetur
adipisicing elit. Voluptate odit aspernatur veritatis,
quasi asperiores ab consequatur modi quia perspiciatis
ex ipsum ut laborum laboriosam, rem, similique ipsam ad?
Necessitatibus, voluptatum!

可使用網路正則表達式網站 regex101 一併實作看看,會更清楚喔!

字元類別 (Character Classes)

. dot 點

除了斷行以外,其他通通都會匹配。

all

\s match space

除了字符以外,匹配所有空格。

s

\S match string

除了空格以外,匹配所有字符。

S

\w 匹配所有文字

效果等同於 [a-zA-Z0-9_],但不能選到特殊符號。

w

\W 除了文字外都匹配

也就是 [^a-zA-Z0-9_],\w 的相反效果。

W

\d 匹配所有數字 0-9

效果等同於[0-9]

d

原範例沒有數字,在最後面加上數字,才匹配得到。

\D 除了數字外都匹配

效果等同於 [^0-9],\d 的相反效果。

D

[a-z] 與 [A-Z] 匹配大小寫

  • [a-z]:匹配所有小寫字符,數字與符號除外。
  • [A-Z]:匹配所有大寫字符,數字與符號除外。
  • [^a-z]:除了小寫字符外,其他都匹配。
  • [^A-Z]:除了大寫字符外,其他都匹配。

錨點符號

\b 單字邊界

匹配字符的前後的起末點,除了空白字元與標點符號,以及字串開頭或結尾外,不可再有其他字符。

b

\B 非單字邊界

\b 的相反效果,也就是原本單字邊界沒有匹配到的,都會匹配到。

B

常用的特殊字元

  • \n 換行字元。
  • \0 null 字元。
  • . 因為已經是跳脫字元,所以變成一般的點。
  • / 反斜線。

\1 Backreference 回參考

匹配對稱的字符。

範例文字如下:

1
2
3
abc=abc,
def=def
abc=def

\1

$1 替換

主要是把原本的字串替換成要加上的元素。

1
2
3
4
5
6
7
let str = document.querySelector(".str");
let string = "abc=abc";
str.textContent = string;
const regex = /(abc)=\1/gm;
let replace = "xx$1xx";
let result = string.replace(regex, replace);
str.textContent = result;

點此連結看>>>範例效果

左右合樣 Lookaround

有四種 pattern:

  1. 右合樣 a(?=b)
  2. 右不合樣。a(?!b)
  3. 左合樣。(?<=b)a
  4. 左不合樣。(?<!a)b

以下方字串為例:

1
2
3
4
5
6
7
8
9
abandon
aboard
absolute
active
add
address
advice
attribute
apple

用來判斷右(左)邊緊接著的字元是否符合比對條件,如果符合條件才會繼續比對下去。

右合樣、正向肯定預查 Positive Lookahead

如字面所表示,從右邊開始匹配,遇到匹配條件才會成功匹配出結果,否則會跳過。

right

小括號是群組此匹配條件,問號代表前面的字元可出現 0 到 1 次,匹配條件可有可無,若有只能匹配一次。本次範例匹配條件為在 a 右面要找到 b 才符合匹配條件,並且找到一個 b 就會停止匹配。

右不合樣、正向否定預查 Negative Lookahead

匹配結果會與右合樣相反。

not b

a 後面不是 b 的單字字串都會被匹配出來。

左合樣、反向肯定預查 Positive Lookbehind

從左邊開始匹配,遇到匹配條件才會出現匹配結果,否則會跳過。

l

要找出 b 左邊有 a 的字串才符合匹配條件,並找到一個 a 就停止匹配。

左不合樣、反向否定預查 Negative Lookbehind

匹配結果與左合樣相反。

not l

左右合樣匹配條件是不佔空間的,所以比對完條件後會再回到字符起點,再比對第二個條件,也是如此特性,如果複雜又沒有寫好的合樣條件,可能演變成無限迴圈而佔用 CPU 資源,

實戰範例

驗證密碼的條件

  1. 至少有一個數字
  2. 至少有一個小寫英文字母
  3. 至少有一個大寫英文字母
  4. 字串長度在 6 ~ 30 個字母之間

正則可以寫成:^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,30}$

example

匹配網址

若網址如下:

1
2
3
4
https://www.google.com
https://www.youtube.com
http://testweb.com.tw
https://www.nasa.gov

正則可寫成:https?:\/\/(www\.)?(\w+)(\.\w+)(\.\w+)?

說明:

  1. 一定會有 http 但不一定會有 S,所以在 s 後面加問號。
  2. 會有冒號與 // 雙斜線符號。
  3. www. 群組成為匹配條件,但有可能網址沒有此字串,故使用冒號。
  4. 取得中間網址所有字串。
  5. 取得 . 之後所有的字串,也就是 .com, .gov 之類的。
  6. 最後不一定會有國碼字串,故也選到 . 之後所有字串並且給問號代表選填。

ex

修飾詞 Flags

正則表達式引擎有預設規則,可依照不同設定給予不同的修飾詞改變匹配結果。

g - global search 全域模式

使用全局匹配模式。有時候你會希望重複匹配目標字串多次,使用 g flag 就可以保留 lastIndex 的狀態,讓下一次再匹配時,可以從 lastIndex 的位置開始找起,你就可以遍歷整個文本中的所有可匹配字串,而不是每一次再匹配時都得到一樣的結果 (文本中從頭開始第一個找到的字串)。另外預設上,如果沒有開啟 g flag,Regex 引擎只會返回「第一個」匹配到的字串結果。

m - multiline 多行模式

使用多行模式,使 ^$ 會比對每一行的開頭與結尾,而不是輸入字串的開頭和結尾。

i - case insensitive 忽略大小寫

使用不區分大小寫的比對方式。

s - singleline 單行模式

使用單行模式,使句點 . 會比對每個字元,而不是換行符號 \n 以外的每個字元

優先權

sort

找中文

正則可以寫:\p{L}

chinese

參考資料