正則表達式/规则运算式(Regex):一篇从此告别手动筛选,解决文字难题

Author: Eason
Regex-big-image


正则表达式不是一种程式语言,而是一套用来描述「字串样式规则」的语法,我们称之为正则表达式(Regular Expression),又称规则运算式,简称 Regex。正则表达式就像一位数据世界的魔法符号,当你掌握这些符号,例如 ^、$、``,就能搞定复杂的数据搜寻、验证和替换任务,大幅提升你的工作效率与精准度,本篇文章将帮助读者更轻松地跨越困难的正则表达式学习。
 

Regex 的用途有哪些?

因为它能让你用非常简洁的方式完成复杂的文字处理任务,主要用途:

验证资料:检查使用者输入的电子邮件地址、电话号码、身分证字号格式是否正确。

搜寻与取代:在文字编辑器或程式码中,快速找到符合某种复杂模式的所有内容,并批次取代,例如:将所有的日期格式从 「YYYY-MM-DD」 改为 「MM/DD/YYYY」。

撷取资讯:从一大段文字(如日志档案、网页程式码)中抓取你需要的特定部分。例如:从伺服器记录中提取所有出错的时间戳记。

分割字串:按照复杂的规则(而不仅仅是单个字元)来分割字串。
 

在哪里可以用 Regex?

文字编辑器:如 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 后面的任何值,无论其内容为何。


(本文为达文西数位科技所有,禁止文图使用)

目前于达文西数位担任行销总监,SEO如战场般变化万千,要不断研究学习,才能在竞争激烈的市场上占有一席之地。

SEO套版網站,優惠 $ NT 62,000 (1年代管+SSL)

請與我們聯繫
線上客服 TOP