免费工具 正则表达式在线测试工具:高亮匹配、分组、替换
写好一条正则,把要测的文本一行一条贴进来:每行命中了什么、分组取到了什么、替换后长什么样,边输边看。写给 Google Analytics(GA4)、BigQuery 用的正则,切到 GA4 模式:按「整串匹配、区分大小写、RE2 语法」的口径检查,JavaScript 能跑但 GA4 不认的写法会直接标出来。
- JavaScript / GA4 两种口径
- RE2 兼容性提示
- 本地运行
测试你的正则
示例是常见的「手机号脱敏」:找出 11 位手机号,中间四位换成星号。注意第 4 行流水号也被误伤了,改一改正则试试,或者点下面的预设换一个场景。
不用写两边的斜杠 /…/。
一行一条,每行单独匹配。
仅 JavaScript 模式。分组用 $1、$2 或 $<名称>。
命中行数
3
至少有一处匹配的行。
测试行数
6
正则长度
24
GA4 报表筛选最多 250 个字符。
检查结果
RE2 / GA4 兼容性和常见笔误。
- 正常这条也符合 RE2 语法,可以搬到 GA4、BigQuery、Looker Studio、Go 里用。
匹配结果
高亮的是匹配到的内容;橙色表示只匹配了一部分(GA4 整串匹配下不算命中)。
| 行 | 测试文本 | 结果 | 分组 |
|---|---|---|---|
| 1 | 客服电话 13800138000,备用 19912345678 | 命中 | 1: 1382: 00133: 8000 |
| 2 | 订单号 202611090001 | 未命中 | — |
| 3 | 座机 010-12345678 | 未命中 | — |
| 4 | 流水号 813800138000 | 命中 | 1: 1382: 00133: 8000 |
| 5 | +86 15012345678 | 命中 | 1: 1502: 12343: 5678 |
| 6 | 12345678901 | 未命中 | — |
客服电话 138****8000,备用 199****5678
订单号 202611090001
座机 010-12345678
流水号 8138****8000
+86 150****5678
12345678901分享这组输入:数值写在链接的 # 后面,不会发到服务器。
https://tapcub.com/zh/tools/ga4-regex-tester
版本 v1.0更新于 更新记录
命中、部分匹配、未命中
每一行会得到三种结论之一。中间那种,是 GA4 筛选最常出错的地方。
命中
JavaScript 模式下,这一行至少有一处匹配,所有匹配都会高亮,分组列显示第一处匹配的各个分组。GA4「匹配正则」模式下,整行都被这条正则覆盖才算命中。
部分匹配
只在 GA4「匹配正则」模式出现:正则出现在这一行里,但没从头覆盖到尾。GA4 会把这个值排除在外。要么在正则两边加 .*,要么改用「部分匹配正则」。
未命中
整行里都没找到匹配,大小写不同也算没找到。GA4 的正则区分大小写,chatgpt 匹配不到 ChatGPT。
检查结果
「RE2 不支持」表示这条正则在 GA4、BigQuery、Go 里会报错或结果不同;「注意」是语法没错但多半写错了,比如没转义的点、结尾多一个 |。
匹配用的是你浏览器的 JavaScript 引擎,RE2 独有的写法会先换成等价的 JS 写法再跑。GA4 支持的 RE2 语法范围内,两种引擎结果一致;标了「RE2 不支持」的写法在 GA4 里可能表现不同。
三步
不用点「测试」,输入就出结果。
-
1
写正则、选口径
一般的文本处理、表单校验、日志提取选 JavaScript;要粘进 GA4 渠道分组或报表筛选的选「匹配正则(整串)」或「部分匹配正则」。
-
2
贴真实的测试文本
一行一条,既要放应该命中的,也要放不该命中的。数据来自报表时,直接导出那一列贴进来。
-
3
看高亮和检查结果
该命中的都命中、不该命中的都没命中,检查结果里没有「RE2 不支持」,再复制去用。需要替换时在「替换为」里写 $1、$2。
常用写法和 RE2 / JavaScript 差异
大多数写法在 JavaScript 和 RE2(GA4、BigQuery、Go 用的引擎)里一样;差别集中在前瞻、后顾、反向引用这些需要回溯的功能上。
- 匹配中文:JavaScript 用
[\u4e00-\u9fa5],或开 u 标志后用\p{Script=Han};RE2 写\p{Han} - GA4「匹配正则」等于在正则外面套
^(?:…)$,并且区分大小写 - GA4 报表筛选里的正则最多 250 个字符
| 写法 | RE2(GA4) | JavaScript |
|---|---|---|
^ $ . * + ? | ( ) [ ] {n,m} | 支持 | 支持 |
\d \w \s \b | 支持(仅 ASCII) | 支持 |
懒惰量词 *? +? | 支持 | 支持 |
| 命名分组 | (?P<n>…) 和 (?<n>…) | (?<n>…) |
开头的 (?i) | 支持 | 不支持(用 i 标志) |
| 前瞻 / 后顾 | 不支持 | 支持 |
反向引用 \1 | 不支持 | 支持 |
| 占有量词 / 原子组 | 不支持 | 不支持 |
| 重复次数超过 1000 | 不支持 | 支持 |
手机号脱敏,逐行看
正则 (1[3-9]\d)(\d{4})(\d{4}),替换为 $1****$3,JavaScript 模式。
| 测试文本 | 结果 | 替换后 | 说明 |
|---|---|---|---|
| 客服电话 13800138000,备用 19912345678 | 命中 2 处 | 138****8000、199****5678 | 全局匹配会找出所有手机号 |
| 订单号 202611090001 | 未命中 | 不变 | 没有 1[3-9] 开头的连续 11 位 |
| 座机 010-12345678 | 未命中 | 不变 | 座机格式不同 |
| 流水号 813800138000 | 命中(误伤) | 8138****8000 | 手机号藏在更长的数字里也被匹配了 |
| +86 15012345678 | 命中 | +86 150****5678 | 前面的 +86 不影响 |
| 12345678901 | 未命中 | 不变 | 第二位是 2,不在 3–9 之间 |
要避开第 4 行的误伤,JavaScript 里可以写 (?<!\d)(1[3-9]\d)(\d{4})(\d{4})(?!\d),但这用了前瞻和后顾,切到 GA4 模式会提示 RE2 不支持;在 RE2 里只能改用 (^|\D) 和 (\D|$) 把两边的非数字也匹配进来。
正则写错的几种常见情况
下面四种占了大多数「明明测试通过、一用就错」的情况。
以为 GA4 是部分匹配
GA4「匹配正则」里写 blog,只能匹配值恰好是「blog」的行。要包含匹配写 .*blog.*,或用「部分匹配正则」。
忘了大小写
UTM 参数、活动名称按原样保存,Spring_Sale 和 spring_sale 在 GA4 里是两个值。
把 JS 正则直接贴进 GA4
网上很多答案用 ^(?!.*test) 这样的前瞻,RE2 不认。在 GA4 里改用「不匹配」条件。
点没转义、贪婪匹配
google.com 里的点会匹配任意字符;<.*> 会一口气匹配到最后一个 >,要最短匹配写 <.*?>。
渠道自动分好,不用写正则
TapCub 在每次访问进来时就分好搜索、社交、AI 助手、邮件、付费、外链和直接访问,看流量来源用不着自己维护一堆正则规则。
正则表达式在线测试怎么用?
在上面输入正则(不用写两边的 /),把测试文本一行一条贴进来,结果实时显示:高亮的是匹配到的内容,右边列出分组。要做替换,在「替换为」里写 $1、$2 这样的分组引用。
g、i、m 这些标志怎么设置?
JavaScript 模式默认带 g(找出每行的所有匹配);勾选「忽略大小写」相当于 i。因为每行单独匹配,m(多行)和 s(点匹配换行)在这里用不上。
怎么用正则匹配中文?
JavaScript 常用 [\u4e00-\u9fa5]+ 匹配常用汉字;更完整的写法是开 u 标志后用 \p{Script=Han}。在 RE2(GA4、BigQuery)里写 \p{Han}。
手机号、邮箱的正则怎么写?
大陆手机号常用 ^1[3-9]\d{9}$;邮箱可以用 ^[\w.+-]+@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*\.[A-Za-z]{2,}$。点上面的「手机号」「邮箱」预设可以直接测试。正则只能查格式,号码是否真实存在要靠短信或邮件验证。
GA4 的「匹配正则」是整串匹配吗?
是。Google 帮助中心说明 GA4 的正则默认是整串匹配、区分大小写:San Francisco 只匹配「San Francisco」,.*San Francisco.* 才会连「South San Francisco」一起匹配。报表筛选另有「部分匹配正则」。
为什么我的正则在 GA4 里报错?
GA4 用 Google 的 RE2 引擎,不支持前瞻 (?=…)、后顾 (?<=…)、反向引用 \1、占有量词和原子组;另外报表筛选里的正则最多 250 个字符。切到 GA4 模式,这些都会被标出来。
和百度统计、TapCub 的筛选通用吗?
基础写法(锚点、分组、字符类、量词、|)在各家工具里基本通用;前瞻、后顾这类高级写法是否支持要看各自的引擎。TapCub 的渠道分类是内置的,看来源不需要自己写正则。
输入的内容会上传吗?
不会,全部在你的浏览器里运行。较短的正则和测试文本会写进分享链接 # 后面的部分,浏览器不会把这部分发给服务器。