Skip to main content

Regular Expression

介紹

正規表達式 (Regular Expression) 是一種用來描述字串符合某個語法規則的模式 (Pattern)。

常常被使用來作為文字的搜尋、比對、萃取、替代、轉換等等

撰寫方式

通常有以下兩種:

  1. 使用正規表達式字面值 (Regular Expression Literal),包含兩個斜線 / / 字元之間的模式,會在 Script 載入時就被編譯,效能較好:
const regex = /test sentence/
  1. 使用 new 建構一個 RegExp 物件,適合用在 Regular Expression Pattern 可能會改變時:
const regex = new RegExp('test sentence')

修飾詞

在正規表達式後方加上修飾詞 (Flag) 讓比對功能更為彈性和強大,以下列出常用到的:

修飾詞 Flag意義說明
iignore case比對不區分大小寫。
mmultiline使用多行模式,可以比對換行字串。
gglobal search使用全局匹配模式,比對所有字串。

套用在上面的寫法即可寫成:

// 不區分大小寫去比對
const regex = /test sentence/i

// 比對所有字串
const regex = new RegExp('test sentence', 'g')

特殊字元

搜尋一個除了直接匹配外,包含更多條件的匹配 (比如搜尋一或多個 b,或者搜尋空格),就需要加上特殊字元:

特定字元說明等效的正規表示式
\d數字[0-9]
\D非數字[^0-9]
\w數字、字母、底線[a-zA-Z0-9_]
\W非 \w[^a-zA-Z0-9_]
\s空白字元[ \r\t\n\f]
\S非空白字元[^ \r\t\n\f]

除了以上的特殊字元外,你也可以使用以下字元讓比對功能更強大:

字元說明範例意義
\避開特殊字元/B\?/比對B? (其中 ? 是一個特殊字元,需避開其特殊意義)
^比對字串的第一個位置/^A/比對 Abcd 中的 A (但不可比對 aAb )
$比對字串的最後一個位置/A$/比較 bcdA 中的 A (但不可比對 aAb )
*比對前一個字元0次或以上/bo*/比對 facek book 中的 boo,也可比對 Good bk 中的 b
+比對前一個字元1次或以上/a+/比對 aaapple 中的 aaa ( 但不可比對 cndy )
?比對前一個字元0次或1次/e?l/比對 angel 中的 el,也可比對 angle 中的 l
.比對包含前一個字元的任何字元(不包含換行符號)/.n/比對 nay, an apple is on the tree 中的 an 和 on (但不可比對 nay)
(x)比對 x 並將符合的部分存入一個變數/(a*) and (b*)/比對 aaa and bb 中的 aaa 和 bb,並可各別存入 const regex1 和 const regex2
xy比對 x 或 y/a*b*/g比對 aaa and bb 中的 aaa 和 bb
{n}比對前一個字元 n 次 (n > 0)/a{3}/比對 lllaaalaa 其中的 aaa (但不可比對 aa )
{n,}比對前一個字元至少 n 次 (n>0)/a{3,}/比對 aa aaa aaaa 其中的 aaa 及 aaaa (但不可比對 aa)
{n,m}比對前一個字元至少 n 次,至多 m 次 (n,m >0)/a{3,4}/比對 aa aaa aaaa aaaaa 其中的 aaa 及 aaaa (但不可比對 aa 及 aaaaa)
[xyz]比對中括弧內的任一個字元/[wth]/比對 weather 中的 w 或 t 或 h
[^xyz]比對不在中括弧內出現的任一個字元/[^wth]/比對 weather 中的 e 或 a 或 r (與 [xyz] 功能相反)

使用函式

正規表達式可使用 RegExp 內建函式,

  • test():搜尋字串中是否有符合的部分,回傳 Boolean。
  • exec():以陣列回傳字串中匹配到的部分,否則回傳 Null。

或是使用 JavaScript 的 String Method:

  • match():以陣列回傳字串中匹配到的部分,否則回傳 Null。
  • replace():尋找字串中匹配的部分,並取代。
  • search():尋找字串中是否有符合的部分,有的話回傳 Index,否則回傳 -1。
  • split():在字串根據匹配到的項目拆成陣列。