正規表示式 (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).)*$
  • [ ] Hello YoYo!
  • [x] Hello Hank!

保留差異字元取代

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

在正規表示式中被 () 所選起來的參數可以被保留至變數中。
保留變數會由 $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\]
​


留言

這個網誌中的熱門文章

PHP OO 基礎教學

HTML JS 動態顯示 input file 選取內容

Vue.Js 介紹[1]