
正則表達式(Regular Expression)不是一種程式語言,而是一套用來描述「字串樣式規則」的語法,我們也稱之為正則表示式,又稱規則運算式,簡稱 Regex 或 RegExp。正則表達式就像一位數據世界的魔法符號,當你掌握這些符號,例如 ^、$、``,就能搞定複雜的數據搜尋、驗證和替換任務,大幅提升你的工作效率與精準度,本篇文章將幫助讀者更輕鬆地跨越困難的正則表達式學習。
正則表達式的用途有哪些?
因為它能讓你用非常簡潔的方式完成複雜的文字處理任務,主要用途:
驗證資料:檢查使用者輸入的電子郵件地址、電話號碼、身分證字號格式是否正確。
搜尋與取代:在文字編輯器或程式碼中,快速找到符合某種複雜模式的所有內容,並批次取代,例如:將所有的日期格式從 「YYYY-MM-DD」 改為 「MM/DD/YYYY」。
擷取資訊:從一大段文字(如日誌檔案、網頁程式碼)中抓取你需要的特定部分。例如:從伺服器記錄中提取所有出錯的時間戳記。
分割字串:按照複雜的規則(而不僅僅是單個字元)來分割字串。
在哪裡可以用正則表達式?
文字編輯器:如 VS Code, Sublime Text, Notepad++ 的「尋找和取代」功能都支援 Regex。
命令列工具:如 grep, sed, awk,是處理文字檔案的利器。
程式語言:幾乎所有主流程式語言(Python, JavaScript, Java, C#, PHP, Go 等)都內建了 Regex 支援。
資料庫:一些資料庫(如 PostgreSQL)在查詢時也支援 Regex。
基礎篇:認識正則表達式的「元素」
在深入學習正則表達式(規則運算式)前,有一個小小的建議:現在就打開一個線上 Regex 測試工具,例如 Regex101、regexr,文章中的所有範例,都強烈鼓勵讀者邊看邊試,讓抽象的符號在實際操作中變得直觀易懂。
【 Regex 工具1:Regex101 】
【 Regex 工具2:regexr 】
第一步,從「字」開始
最簡單的匹配,就是「是什麼就找什麼」,這被稱為字面量字元。例如,如果你想找到所有包含 cat 這個單字的地方,你的正則表達式咒語就是 /cat/。它會精準地匹配到字串中的 cat、catnip 或 concatenate。
但如果你的目標不是單一字元,而是任何單一字元呢?這時萬用字元 .(點符號)就派上用場了。它能匹配除了換行符號外的任何單一字元,包括字母、數字、符號或空白。例如 a.c 可以匹配 abc、a#c,甚至 a c,只要 a 和 c 之間有一個字元就可以。
不用一個一個寫「字元集」與「縮寫」
如果需要匹配多種可能的字元,一個個列出來會很麻煩,幸好我們有字元集,也就是中括號,它讓你定義一個集合,只要字串中出現其中任何一個字元,就符合匹配。例如,gr[ae]y 可以同時匹配 gray 或 grey。你也可以用破折號 -來定義一個連續的字元範圍,讓咒語更簡潔。例如,[a-z] 代表所有小寫英文字母,[0-9] 代表所有數字。
中括號還有一個特別的用法:否定,當你在中括號的開頭加上脫字元 ^,例如 [^0-9],它的意思就變成了「除了中括號內的所有字元以外」。因此,[^0-9] 會匹配所有非數字字元,這在需要排除某些數據時非常實用。
為了進一步簡化常用的字元集,正則表達式還提供了一些簡寫,讓你的咒語更短、更易讀。
-
\d:匹配任何數字,等同於 [0-9]。
-
\w:匹配任何英文字母、數字或底線,等同於 [A-Za-z0-9_]。
-
\s:匹配任何空白字元,如空格、Tab 鍵或換行符號。
-
\D、\W、\S:它們分別是上述簡寫的「否定」形式,例如 \D 匹配任何非數字字元。
量詞:決定你的魔法要重複幾次?
當你想匹配重複出現的字元時,量詞就是你的得力助手,它們總是緊跟在要重複的字元或群組後面,決定了匹配的次數。
問號 ?:代表前面的字元出現 0 次或 1 次。也就是說,它「可有可無」。例如,colou?r 就可以同時匹配 color 或 colour。
星號 *:代表前面的字元出現 0 次或多次。它是一個非常「包容」的量詞,即使字元沒有出現也符合匹配。例如,go*gle 可以匹配 ggle(o 出現 0 次)、google(o 出現 2 次)或 gooogle(o 出現 3 次)。
加號 +:代表前面的字元出現 1 次或多次。它與 * 類似,但強制要求字元至少出現一次。例如,ab+c 可以匹配 abc、abbc,但無法匹配 ac。
大括號 {}:提供更精確的次數控制。
-
{n}:精準匹配 n 次。例如,\d{3} 匹配三個連續的數字。
-
{n,}:匹配至少 n 次。例如,\d{5,} 匹配五個或更多數字。
-
{n,m}:匹配至少 n 次,但不超過 m 次。這在設定帳號或密碼的長度限制時非常常見,例如 [a-z]{6,16} 匹配六到十六個小寫英文字母。
正則表達式常用符號速查表
符號 | 說明 | 簡單範例 | 應用情境 |
---|---|---|---|
. | 匹配任意單一字元 | a.b | 匹配 acb, a1b 等 |
[] | 字元集,匹配任一字元 | [aeiou] | 匹配元音字母 |
[^] | 否定字元集,不匹配任一字元 | [^0-9] | 匹配任何非數字字元 |
\d, \w, \s | 常用字元縮寫 | \d{8} | 匹配八位數字 |
? | 0 或 1 次 | colou?r | 匹配 color 或 colour |
* | 0 或多次 | a*b | 匹配 b, ab, aab 等 |
+ | 1 或多次 | a+b | 匹配 ab, aab 等,但不匹配 b |
{n,m} | 指定重複次數範圍 | \d{3,5} | 匹配三到五位數字 |
^ | 錨點:字串開頭 | ^/blog/ | 匹配以 /blog/ 開頭的網址 |
$ | 錨點:字串結尾 | \.pdf$ | 匹配以 .pdf 結尾的字串 |
() | 分組與捕獲 | (go)+ | 匹配 go, gogo 等,並捕獲 go |
| | 或(OR)運算 | (a|b)c | 匹配 ac 或 bc |
\b | 單字邊界 | \bSQL\b | 匹配完整的 SQL 單字,不匹配 NoSQL |
進階魔法篇:讓你的正則表達式更精準強大
當你的需求變得更複雜時,你需要的就不僅僅是匹配字元本身,還需要鎖定它們的位置和關係。
錨點:讓你的匹配釘在特定位置
錨點是一種特殊的符號,它不匹配任何字元,只用來界定匹配的「位置」。
-
脫字元 ^:當它放在正則表達式的開頭時,代表匹配從字串的開頭開始。例如,^eat 可以匹配 eaten,因為 eat 出現在字串開頭。
-
錢字符號 $:代表匹配從字串的結尾結束。例如,eat$ 可以匹配 creat,但不會匹配 eaten。如果結合使用 ^eat$,則會精準匹配 eat 這個字串本身。
-
單字邊界 \b:這是一個極其實用的符號,它用來匹配單字與非單字字元的交界處。這確保了你的匹配對象是一個完整的單字,而非某個單字的一部分。例如,\bSQL\b 可以匹配 learn SQL 中的 SQL,但不會匹配 NoSQL 中的 SQL,在 SQL 查詢中,需要使用 \\b 來轉義。
分組 () 與或 |:一次滿足多個願望
當你想對一組字元執行操作時,就需要使用小括號 () 來進行分組。分組會將括號內的字元視為一個單一單位,讓你可以對它應用量詞。例如,如果你想匹配 gogogo,寫法可以是 (go)+,表示 go 這個群組重複出現一次或多次。
管線符號 | 則代表了或(OR)運算,它讓你能在多個條件中選擇一個進行匹配。當它與分組結合時,會產生極強大的效果。例如,gr(a|e)y 可以同時匹配 gray 或 grey。這在數據分析中非常有用,例如用 (Facebook|Instagram|Google) 一次性篩選出多個社群媒體來源。
捕獲分組與後向引用:讓正則表達式記住你的數據
小括號 () 不僅用於分組,它還具備一個更強大的功能:捕獲。當一個匹配成功時,括號內的子字串會被捕獲並儲存在一個編號的分組中,這個編號從左到右,從 1 開始遞增。
這個捕獲的數據,可以用後向引用的方式,在同一個正則表達式或後續的處理中再次使用。在許多程式語言中,後向引用通常寫作 \1、\2 等。在 JavaScript 等工具的替換功能中,則使用 $1、$2 來引用。這個概念是許多進階應用的基石。例如,(\d+)-\1 可以匹配 2024-2024 這種前後數字相同的模式。
掌握正則表達式的貪婪特性,告別數據陷阱
一個關於量詞的重要觀念,是它們預設是貪婪的,這意味著,*、+ 或 {} 等量詞會盡可能地匹配最長的字串。這在處理 HTML 標籤時最容易出錯。例如,如果你想提取 <td>...</td> 之間的內容,你可能會寫 <td>.*</td>。但如果字串是 <table><tr><td>hello world</td><td>hello regex</td></tr></table>,貪婪模式會從第一個 <td> 一路匹配到最後一個 </td>,而不是兩個獨立的標籤,這會導致你的數據追蹤或篩選出錯。
這個問題的解決方法是將貪婪模式轉換為非貪婪模式,你只需要在量詞後面加上一個問號 ?,例如 *?、+? 或 ??。這樣,正則表達式引擎就會盡可能匹配最短的字串。以同樣的例子,<td>.*?</td> 就可以成功地匹配出 <td>hello world</td> 和 <td>hello regex</td> 兩個獨立的結果。這個簡單的符號,正是確保數據精準的關鍵。
實戰應用篇:正則表達式在 GTM 與 GA4 的超級武器
掌握了這些正則表達式咒語後,你就能在數位行銷的世界中大顯身手,為什麼行銷人需要這項技能呢?因為它能幫助你處理大量、多樣化的 URL 模式,驗證數據格式,排除特定數據,並建立精準的用戶分群。
更深層次來看,正則表達式是連結行銷與工程的橋樑,GTM 與 GA4 提供了友善的介面,但底層仍然仰賴正則表達式這樣的技術。掌握正則表達式,意味著行銷人不再需要事事仰賴工程師來處理複雜的追蹤需求,能夠自主完成更多精細的數據分析任務。這不僅提升了個人技能,也讓整個團隊的協作效率大大提高。
GTM 應用:設定聰明的追蹤規則
在 GTM 的觸發條件設定中,正則表達式的主要應用入口就是運算子選單中的「與規則運算式相符」(Matches Regex),透過這個運算子,你可以將一個複雜的追蹤需求,簡化為一行精準的 Regex 規則。
以下是一些實用的 GTM 追蹤案例:
-
追蹤所有產品頁面:如果你所有產品頁面的網址都包含 /products/,你可以設定 Page Path Matches Regex ^/products/.*。這個咒語會匹配所有以 /products/ 開頭的網頁,無論後面跟著什麼內容。
-
追蹤多種感謝頁面:你的網站可能有不同的結帳感謝頁面,例如 /thank-you 和 /order-confirmation。你可以用 Page Path Matches Regex ^/(thank-you|order-confirmation)/?$,一個咒語就能同時追蹤這兩種頁面。
-
追蹤特定文件下載:如果你想追蹤所有 PDF 或 ZIP 檔案的下載,你可以設定觸發條件為 Click URL Matches Regex \.(pdf|zip|doc)$。這個咒語會匹配所有以 .pdf、.zip 或 .doc 結尾的點擊網址。
GTM 實戰-正則表達式範例表
追蹤目標 | GTM 變數 | 運算子 | 規則運算式範例 | 解析說明 |
---|---|---|---|---|
所有產品頁面 | Page Path | Matches Regex | ^/products/ | 匹配所有以 /products/ 開頭的網址。 |
多種感謝頁面 | Page Path | Matches Regex | ^/(thank-you|order-confirmation)/?$ | 匹配以 /thank-you/ 或 /order-confirmation/ 結尾的網址。| 表示「或」。 |
特定檔案下載 | Click URL | Matches Regex | \.(pdf|zip|xlsx)$ | 匹配以 .pdf、.zip 或 .xlsx 結尾的網址。\ 用於轉義 .,使其成為普通字元。 |
排除特定來源流量 | Page Referrer | Matches Regex | ^https?://(www\.)?mywebsite\.com/ | 匹配來自自身網域的參照網址,通常用於排除追蹤內部流量。s? 表示 s 可有可無。 |
GA4 應用:讓你的數據報表更清晰
在 GA4 中,正則表示式(規則運算式)的應用同樣強大且靈活,它能讓你在數據報告層面進行精準的篩選與分群。
-
數據篩選器:GA4 允許你建立數據篩選器,以便在報告中排除或僅包含特定數據。最經典的應用就是排除內部流量。如果你公司有特定的 IP 位址區段,例如 198.51.100.1 到 198.51.100.25,你不需要手動輸入所有 25 個 IP,只需使用 198\.51\.100\.\d* 即可一次篩選整個 IP 網段。這裡的 \. 用於轉義點符號,確保其被視為一個普通的字元,而不是萬用字元。
-
建立目標對象:利用正則表達式,你可以根據用戶的行為模式或來源建立精準的目標對象(Audience)。例如,你可以篩選所有造訪過產品頁面且來自特定行銷活動(Campaign)的用戶,然後對這個群組進行再行銷。
-
報表中的篩選:在 GA4 的標準報告中,許多維度(Dimension)的篩選框都支援正則表達式。例如,你可以在「網頁路徑與螢幕畫面類別」報告的搜尋框中輸入 ^/blog/,即可快速篩選出所有部落格文章頁面的流量,而非僅查看單一頁面的數據。
透過正則表達式,我們可以從龐雜的 URL 中提取出更有意義的模式,例如商品 ID、語言代碼、活動名稱等,從而進行更深入的分析,例如分析特定 ID 商品的熱銷程度、不同語言版本的表現差異,或哪些活動的用戶轉換率最高。
練習時間到了,考驗你的正則表達式功力
現在,是時候動手練習了,嘗試自己寫出下列問題的正則表達式咒語,並在文章結尾檢查你的答案。
1. GTM 觸發條件 - 追蹤多個感謝頁面:
-
情境: 你的電商網站有兩種不同的訂單完成感謝頁面,網址分別是 /order-confirm 和 /thank-you。你希望在 GTM 中設定一個單一的「事件」,當使用者造訪這兩個頁面時都能觸發。
-
問題: 撰寫正則表達式,用來設定 Page Path 的「與規則運算式相符」觸發條件,讓它能同時匹配這兩個網址,並確保是從字串開頭開始匹配。
2. GA4 目標對象 - 排除特定內部流量:
-
情境: 你的公司 IP 網段是 198.51.100.1 到 198.51.100.25。你希望在 GA4 的目標對象中,排除所有來自這個 IP 範圍的內部員工流量,以獲得更乾淨的數據。
-
問題: 撰寫正則表達式,用來設定 GA4 數據篩選器,一次性匹配這個 IP 網段,而不是手動輸入 25 個獨立的 IP 位址。
3. GA4 報表篩選器 - 找出特定分類的產品:
-
情境: 你的產品網址結構為 /products/category-name/product-id,例如 /products/electronics/tv-101 或 /products/home-appliances/fridge-202。你希望在 GA4 報表中,快速篩選出所有「電子產品」或「家用電器」分類的所有產品頁面。
-
問題: 撰寫正則表達式,用來在 GA4 報表的搜尋框中,同時篩選出這兩個分類的所有產品頁面。
4. GTM 觸發條件 - 追蹤多種檔案下載:
-
情境: 你希望追蹤網站上所有 .pdf 和 .zip 檔案的下載行為。
-
問題: 撰寫正則表達式,設定 GTM 的 Click URL 觸發條件,用來匹配任何以 .pdf 或 .zip 結尾的點擊連結。
5. GTM 觸發條件 - 追蹤多個行銷活動網址:
-
情境: 你正在進行多個行銷活動,其網址都含有 utm_campaign 參數,但值不同,例如 ?utm_campaign=summer_sale 或 ?utm_campaign=spring_promo。你希望設定一個通用的 GTM 觸發條件,追蹤所有來自這些活動的頁面瀏覽。
-
問題: 撰寫正則表達式,用來設定 Page URL 的觸發條件,匹配所有帶有 utm_campaign 參數的網址,無論其值是什麼。
總結&下一步:如何讓你的正則表達式功力更上一層樓
恭喜你,到這裡,你已經掌握了正則表達式的基礎與進階概念,並能夠應用於實際問題。正則表達式雖然初學時可能看起來有些複雜,但一旦你熟悉了它的語法,它將成為你處理任何文字任務時,不可多得的得力助手。
學習正則表達式的過程不只是一個技術的習得,更是一種邏輯思維的訓練。透過不斷地建構、測試與除錯,你將鍛鍊出更精準、嚴謹的問題解決能力。為了讓你的學習之路更加順暢,以下提供幾點建議:
-
多練習:沒有捷徑,多動手寫、多測試是唯一的王道。
-
使用工具:利用線上 Regex 測試工具,如 Regex101 或 RegExr。這些工具不僅能讓你即時看到匹配結果,還能詳細解釋你的模式,幫助你有效除錯。
-
持續探索:本文因篇幅限制,僅介紹了正則表達式的核心概念。在未來,你可以繼續探索更多進階主題,例如「非捕獲分組 (?:...)」、先行/後行斷言 (?<...),以及針對不同語言的 Unicode 屬性 \p{...}。
記住,文章核心是將抽象的概念,轉化為具體的、可操作的知識,希望這篇文章能成為你正則表達式(規則運算式)學習旅程中的一個穩固起點。
練習題解答揭曉
練習題 1:
正則表達式: ^/(order-confirm|thank-you)$
-
解析: ^ 錨定到字串開頭。小括號 () 將 order-confirm 和 thank-you 視為一個分組。 | 符號代表「或」的邏輯,讓模式能夠匹配兩個網址中的任何一個。 $ 則確保匹配在字串結尾結束。
練習題 2:
正則表達式: ^198\.51\.100\.\d{1,2}$
-
解析: ^ 錨定到字串開頭。 198\.51\.100\. 是字面量匹配,其中點號 . 使用反斜線 \ 進行跳脫,避免其被當作萬用字元。\d{1,2} 匹配一到兩個數字,這足以涵蓋 1 到 25,是一種常見的簡化寫法。$ 錨定到字串結尾。
練習題 3:
正則表達式: ^/products/(electronics|home-appliances)/
-
解析: ^ 錨定到字串開頭。products/ 是字面量匹配。() 和 | 的組合用來同時篩選 electronics 和 home-appliances 這兩個分類名稱。模式結尾的 / 確保匹配只針對分類頁面,而不是以分類名稱開頭的其他網址。
練習題 4:
正則表達式: \.(pdf|zip)$
-
解析: \. 轉義點號 .,確保其被當作字面量字元。() 和 | 建立分組,匹配 .pdf 或 .zip 這兩種檔案類型。$ 則確保匹配只針對結尾是 .pdf 或 .zip 的網址。
練習題 5:
正則表達式: \?utm_campaign=.+
- 解析: \? 轉義問號 ?,因為在網址中它代表查詢參數的開始。utm_campaign= 字面量匹配。. 匹配任何字元,而 + 則表示該字元出現一次或多次。這個組合能夠匹配 utm_campaign 後面的任何值,無論其內容為何。
(本文為達文西數位科技所有,禁止文圖使用)