正規表示式 - Regular Expression

正規表示式 (Regular Expression)能為你檢查是否為全英文字串! 很專業!

正規表示式 (Regular Expression)能為你檢查是否為指定結構字串! 很貼心!

正規表示式 (Regular Expression)能為你找出複雜性組成字串! 很厲害!

What is it?

Regular Expression 又稱正規表達式正規表示法規則運算式常規表示法。是一門電腦科學,是用來比對字串是不是有符合正確的格式

語法簡單,功能強大,最重要的是!幾乎已知的語言都有支援他。包誇了各大編譯器皆有支援。

開始之前

讓我們擁有一個實用的線上工具 regex101

您可以在 TEST STRING 的地方輸入 focus,在於 REGULAR EXPRESS 的地方輸入 focus 或其中一字元都行(注意大小寫)。是否被選起來了呢!

下面的教學皆可直接扔進線上工具內使用哦!

  • 注意: 正規表示法使用時前後須由 / 包起來(/a/),但該工具 REGULAR EXPRESS 中輸入時不用。

語法

字元

1
2
a: a字元
.: 所有可能的字元(字母、數字或符號)。
RegExp 說明 範例
/a/ 含有字元 a a , ab , ba , bbacc
/./ 任意單一字元 a , ab , ba , bbccc , 哈囉
/a./ 含有字元 a 且後面接任意單一字元 a1 , ab , a囉

次數

1
2
3
4
5
6
7
8
*: 比對前一個字串 0 次或是多次。
?: 比對前一個字串或是不比對。
+: + 跟 * 類似,差別在於它至少要與前一個字比對一次或以上。

{n,m}: 指定出現次數,n 為最小次數 m 為最大次數。
{2}: 2 次。
{2,}: 2 次以上。
{2,5}: 2 到 5 次。
RegExp 說明 範例
/ba*c/ bc 字元中間,a 字元出現 0 次或是多次。 bc , bac , baaac
/ba?c/ bc 字元中間,a 字元出現 0 次或一次。 bc , bac
/ba+c/ bc 字元中間,a 字元出現 0 次或一次。 bac , baaac
/ba{2}c/ bc 字元中間,a 字元出現 2 次。 baac
/ba{2,}c/ bc 字元中間,a 字元出現 2 次以上。 baac , baaac
/ba{2,5}c/ bc 字元中間,a 字元出現 2 - 5 次。 baac , baaaaac

條件

1
2
3
4
^: 字串開頭。
$: 字串結尾。
|: 前字串或者後字串。
\: 跳脫特殊字元。 若要比對正規表示式內部特殊字元(*?+{}[] 等...),需用反斜線來跳脫這些特殊字元。
RegExp 說明 範例
/^ab/ ab 開頭字串。 ab , abc
/ab$/ ab 結尾字串。 ab , cab
/acc bcc/ acc 字串或 bcc 字串。
/a\*/ a*字串。 a* , aa* , a*a

多字元篩選

1
2
3
[ ] : [] 內所包含字元。
[^] : 不存在 [] 內的任何字元。
[-] : 連號字元(0-9 a-z A-Z)。
RegExp 說明 範例
/[abc]/ abc 任一字串。 abc , ade , bde , cde
/[^abc]/ 非 abc 任一字串。 def , ggg , ddd
/[0-9]/ 數字 0 - 9 0123456789 , a0b , 9a8n
  • [ ] 後面接上 {n},則會取得 [] 中指定數量組合(不分順序)。

    1
    EX: [abc]{2} : `ab` , `cb` , 'ac'

特殊字元

1
2
3
4
5
6
\d: 任何數字字元,等同 [0-9]
\D: 任何非數字字元,等同 [^0-9]
\w: 任何數字字母底線,等同 [A-Za-z0-9_]
\W: 任何非數字字母底線,等同 [^A-Za-z0-9_]
\s: 任何空白字元(空白,換行,tab),等同 [ \f\n\r\t\v]
\S: 任何非空白字元(空白,換行,tab),等同 [^ \f\n\r\t\v]

實例

1
2
3
4
5
6
7
8
西元生日: 四個數字開頭 - 兩個數字 - 兩個數字結尾
RegExp: /^\d{4}-\d{2}-\d{2}$/

身分證字號: 英文字母開頭(大寫) 九個數字
RegExp: /^[A-Z]\d{9}$/

手機號碼: 國碼開頭(09) 八個數字
RegExp: /^09\d{8}$/

同場加映

Regex matching line not containing the string
不包含指定的字元!

1
RegExp: ^((?!YoYo).)*$
  • Hello YoYo!
  • Hello Hank!

保留差異字元取代

  • 筆者覺得這個超重要,大家一定要會。

正規表示式中被 () 所選起來的參數可以被保留至變數中。
保留變數會由 $1 $2 $3 所使用。

1
2
3
4
5
6
7
8
9
10
# 一段句子中,若只替換問候語而保留人名。
Hello, YoYo!
Hello, Hank!

搜尋 RegExp: /Hello, (.*)!/
取代 RegExp: /Shit, $1!/

# 輸出結果
Shit, YoYo!
Shit, Hank!

什麼? 你問我這有什麼用?
筆者遇到的問題是,因為語言版本的關係。要將程式內的變數使用 {} 替換為 [];

1
2
3
4
5
6
7
8
Ex:
$str{0};
$str{1};
$str{2};
$str{3};

$str{'name'};
$str{'email'};

總不可能要我一個一個去替換吧!!
這邊考考各位,要怎麼一組替代語法將 $str{} 替換成 $str[]
筆者的答案在下方哦 ※1。

結語

Regular Expression 是非常好用的工具,且應用範圍很廣。編譯器對專案全區域搜尋、各程式語言內部使用設置是資料庫應用都可以做出很好的工作效率。

這篇只是筆者對基本 Regular Expression 的介紹。
大家能在利用網路資源,進行更深入的學習。


※1:

1
2
搜尋 RegExp:  \$str\{([^\}]*)\}
取代 RegExp: \$str\[$1\]
Author

LinYoYo

Posted on

2021-02-23

Updated on

2021-02-25

Licensed under