正規表達式食譜示意圖

正規表達式很強大,但每次都從零組裝相當費力。本文整理了可直接複製使用的實務正規表達式食譜,並為每一個附上「會比對到什麼」的說明。同時也整理了字數統計、逸脫等日常文字處理的訣竅。

若想先學習基礎語法(中繼字元與量詞的含義),建議先閱讀正規表達式的基礎

先掌握:量詞與字元類別

在食譜之前,先確認最常用的零件。

模式含義
\d一個數字([0-9]
\w英數字與底線
\s空白字元(半形空格、Tab、換行等)
.任意一個字元(換行除外)
+前一項出現 1 次以上
*前一項出現 0 次以上
?前一項出現 0 次或 1 次
{2,4}前一項出現 2~4 次
^ / $行首 / 行尾

可複製貼上的食譜

擷取電子郵件地址

實務上「完全正確」的電子郵件正規式過於複雜而不切實際。若用於從日誌或文字中擷取,下面的實用模式就足夠了。

[\w.+-]+@[\w-]+\.[\w.-]+

可比對到 [email protected] 這類地址。

擷取 URL

https?://[\w./?=&%#-]+

同時對應 http://https://s? 表示「s 出現 0 次或 1 次」)。

驗證日期(YYYY-MM-DD)

^\d{4}-\d{2}-\d{2}$

可比對到 2026-06-19 這類格式。^$ 強制「整行恰好是這個格式」。

合併連續空白(取代)

整理複製貼上產生的多餘空白的經典做法。

搜尋:  \s+
取代:  (一個半形空格)

\s+ 會比對到一連串連續空白,因此可一次合併成一個空格。

用擷取群組重新排序

名 姓 換成 姓 名,在取代中引用群組。

搜尋:  (\S+)\s+(\S+)
取代:  $2 $1

可將 Taro YamadaYamada Taro(其中 $1$2 為擷取部分的引用)。

容易卡關之處

  • 貪婪比對<.+> 會「從第一個 < 一路吞到最後一個 >」。若要最短比對,請加上 ?<.+?>
  • 逸脫中繼字元:若要直接搜尋 . ? ( [ 等,請用反斜線逸脫:\.
  • 跨換行比對. 通常不比對換行。處理多行時,請使用 [\s\S],或開啟工具的 s(dotall)旗標。

撰寫的模式是否如預期運作,最好在Regex 測試器中以實際文字套用並確認高亮。也可以當場預覽取代結果。

不需正規表達式的「文字處理」也交給工具

有些常見但不需動用正規表達式的工作。

  • 字數統計:檢查社群貼文或 meta description 的長度。
  • HTML 逸脫:將 < > & 轉成實體參照,讓標記原樣顯示。
  • 大小寫轉換:在 snake_casecamelCase 之間切換。
  • 刪除重複行與排序:整理清單。

這些都整合在文字處理工具中。與正規表達式搭配使用,能減少與文字之間的瑣碎搏鬥。

常見問題

聽說正規表達式的 ? 有兩種含義?

沒錯。作為量詞(a?)時表示「前一項出現 0 次或 1 次」。緊接在另一個量詞之後(.+?)時,則指定「最短比對(非貪婪)」。其角色會依位置而改變。

想嚴格驗證電子郵件地址。

完全符合 RFC 的正規式會複雜到難以實用。實務上通常只做寬鬆檢查(「包含一個 @,且前後都有字元」),真正是否有效則靠寄送驗證信來保證。若是擷取用途,上面的內文模式就足夠。

不同語言的正規表達式行為會不同嗎?

基本語法是共通的,但旗標的指定方式(如 JavaScript 的 /pattern/gi)與後向參考(lookbehind)的支援程度有差異。瀏覽器上的測試器以 JavaScript 引擎運行,適合在嵌入前端程式前先做確認。