Tools mentioned in this article
Open the browser-based tool while you read and try the workflow immediately.

正規表達式很強大,但每次都從零組裝相當費力。本文整理了可直接複製使用的實務正規表達式食譜,並為每一個附上「會比對到什麼」的說明。同時也整理了字數統計、逸脫等日常文字處理的訣竅。
若想先學習基礎語法(中繼字元與量詞的含義),建議先閱讀正規表達式的基礎。
先掌握:量詞與字元類別
在食譜之前,先確認最常用的零件。
| 模式 | 含義 |
|---|---|
\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 Yamada → Yamada Taro(其中 $1、$2 為擷取部分的引用)。
容易卡關之處
- 貪婪比對:
<.+>會「從第一個<一路吞到最後一個>」。若要最短比對,請加上?:<.+?>。 - 逸脫中繼字元:若要直接搜尋
.?([等,請用反斜線逸脫:\.。 - 跨換行比對:
.通常不比對換行。處理多行時,請使用[\s\S],或開啟工具的s(dotall)旗標。
撰寫的模式是否如預期運作,最好在Regex 測試器中以實際文字套用並確認高亮。也可以當場預覽取代結果。
不需正規表達式的「文字處理」也交給工具
有些常見但不需動用正規表達式的工作。
- 字數統計:檢查社群貼文或 meta description 的長度。
- HTML 逸脫:將
<>&轉成實體參照,讓標記原樣顯示。 - 大小寫轉換:在
snake_case與camelCase之間切換。 - 刪除重複行與排序:整理清單。
這些都整合在文字處理工具中。與正規表達式搭配使用,能減少與文字之間的瑣碎搏鬥。
常見問題
聽說正規表達式的 ? 有兩種含義?
沒錯。作為量詞(a?)時表示「前一項出現 0 次或 1 次」。緊接在另一個量詞之後(.+?)時,則指定「最短比對(非貪婪)」。其角色會依位置而改變。
想嚴格驗證電子郵件地址。
完全符合 RFC 的正規式會複雜到難以實用。實務上通常只做寬鬆檢查(「包含一個 @,且前後都有字元」),真正是否有效則靠寄送驗證信來保證。若是擷取用途,上面的內文模式就足夠。
不同語言的正規表達式行為會不同嗎?
基本語法是共通的,但旗標的指定方式(如 JavaScript 的 /pattern/gi)與後向參考(lookbehind)的支援程度有差異。瀏覽器上的測試器以 JavaScript 引擎運行,適合在嵌入前端程式前先做確認。