正規表示式 (Regular Expression)
正規表示式 (Regular Expression)能為你檢查是否為全英文字串! 很專業!
正規表示式 (Regular Expression)能為你檢查是否為指定結構字串! 很貼心!
正規表示式 (Regular Expression)能為你找出複雜性組成字串! 很厲害!
What is it?
Regular Expression 又稱正規表達式、正規表示法、規則運算式、常規表示法。是一門電腦科學,是用來比對字串是不是有符合正確的格式。
語法簡單,功能強大,最重要的是!幾乎已知的語言都有支援他。包誇了各大編譯器皆有支援。
開始之前
讓我們擁有一個實用的線上工具 regex101。
您可以在 TEST STRING 的地方輸入 focus,在於 REGULAR EXPRESS 的地方輸入 focus 或其中一字元都行(注意大小寫)。是否被選起來了呢!
下面的教學皆可直接扔進線上工具內使用哦!
- 注意: 正規表示法使用時前後須由
/包起來(/a/),但該工具 REGULAR EXPRESS 中輸入時不用。
語法
字元
a: a字元
.: 所有可能的字元(字母、數字或符號)。
| RegExp | 說明 | 範例 |
|---|---|---|
| /a/ | 含有字元 a | a , ab , ba , bbacc |
| /./ | 任意單一字元 | a , ab , ba , bbccc , 哈囉 |
| /a./ | 含有字元 a 且後面接任意單一字元 | a1 , ab , a囉 |
次數
*: 比對前一個字串 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 |
條件
^: 字串開頭。
$: 字串結尾。
|: 前字串或者後字串。
\: 跳脫特殊字元。 若要比對正規表示式內部特殊字元(*?+{}[] 等...),需用反斜線來跳脫這些特殊字元。
| RegExp | 說明 | 範例 | |
|---|---|---|---|
| /\^ab/ | ab 開頭字串。 | ab , abc |
|
| /ab$/ | ab 結尾字串。 | ab , cab |
|
| /acc | bcc/ | acc 字串或 bcc 字串。 | aacc , abcc |
| /a\*/ | a*字串。 | a* , aa* , a*a |
多字元篩選
[ ] : [] 內所包含字元。
[^] : 不存在 [] 內的任何字元。
[-] : 連號字元(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},則會取得[]中指定數量組合(不分順序)。EX: [abc]{2} : `ab` , `cb` , 'ac'
特殊字元
\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]
實例
西元生日: 四個數字開頭 - 兩個數字 - 兩個數字結尾
RegExp: /^\d{4}-\d{2}-\d{2}$/
身分證字號: 英文字母開頭(大寫) 九個數字
RegExp: /^[A-Z]\d{9}$/
手機號碼: 國碼開頭(09) 八個數字
RegExp: /^09\d{8}$/
同場加映
Regex matching line not containing the string
不包含指定的字元!
RegExp: ^((?!YoYo).)*$
保留差異字元取代
- 筆者覺得這個超重要,大家一定要會。
在正規表示式中被 () 所選起來的參數可以被保留至變數中。
保留變數會由 $1 $2 $3 所使用。
# 一段句子中,若只替換問候語而保留人名。
Hello, YoYo!
Hello, Hank!
搜尋 RegExp: /Hello, (.*)!/
取代 RegExp: /Shit, $1!/
# 輸出結果
Shit, YoYo!
Shit, Hank!
什麼? 你問我這有什麼用?
筆者遇到的問題是,因為語言版本的關係。要將程式內的變數使用 {} 替換為 [];
Ex:
$str{0};
$str{1};
$str{2};
$str{3};
$str{'name'};
$str{'email'};
總不可能要我一個一個去替換吧!!
這邊考考各位,要怎麼一組替代語法將 $str{} 替換成 $str[] !
筆者的答案在下方哦 ※1。
結語
Regular Expression 是非常好用的工具,且應用範圍很廣。編譯器對專案全區域搜尋、各程式語言內部使用設置是資料庫應用都可以做出很好的工作效率。
這篇只是筆者對基本 Regular Expression 的介紹。
大家能在利用網路資源,進行更深入的學習。
※1:
搜尋 RegExp: \$str\{([^\}]*)\}
取代 RegExp: \$str\[$1\]
留言
張貼留言