跳到主要内容

正则测试

实时匹配高亮、分组查看与替换预览,附风险提示

实时高亮所有匹配,并标出每一处的起始位置列出捕获分组与命名分组,未参与匹配的分组也会标明替换预览支持
amp;、$1、
lt;name> 全部引用语法
内置灾难性回溯风险提示,避免浏览器被卡死
//g

匹配结果共 3 处匹配

  • order-2024-03-15位置: 0
    第 1 组: 2024第 2 组: 03第 3 组: 15
  • order-2024-03-18位置: 25
    第 1 组: 2024第 2 组: 03第 3 组: 18
  • order-2024-04-02位置: 50
    第 1 组: 2024第 2 组: 04第 3 组: 02

高亮预览

order-2024-03-15 id:8823
order-2024-03-18 id:9911
order-2024-04-02 id:1042
amp; 整体匹配、$1 分组、
lt;name> 命名分组" spellCheck="false" class="bg-card border-border focus:border-primary h-11 w-full rounded-xl border px-4 font-mono text-[13px] outline-none transition-colors" value="$1/$2/$3"/>

替换结果

2024/03/15 id:8823
2024/03/18 id:9911
2024/04/02 id:1042

语法速查

  • \d数字 0-9
  • \w字母、数字或下划线
  • \s空白字符
  • .任意字符(默认不含换行)
  • ^字符串或行的开头
  • $字符串或行的结尾
  • *前一项出现 0 次或多次
  • +前一项出现 1 次或多次
  • ?前一项出现 0 次或 1 次
  • {n,m}前一项出现 n 到 m 次
  • [abc]字符类,匹配其中任意一个字符
  • (a|b)分支,匹配 a 或 b
  • (?:...)非捕获分组,不占分组编号
  • (?<name>...)命名分组,可用
    lt;name> 引用
  • (?=...)正向先行断言,不消耗字符
  • (?<=...)正向后行断言,不消耗字符

最后更新:2026-10-10

工具介绍

写正则最耗时的环节永远是「试」—— 试了发现括号少一个,改了又发现贪婪匹配吃掉了不该吃的内容。本工具把匹配结果、捕获分组、起始位置和替换效果同时摆出来,改一个字符就能立刻看到全部影响,不用反复在控制台里 print。

功能特性

实时高亮与位置标注

输入或修改正则时结果立即更新,匹配片段直接高亮。每处匹配都给出起始位置,中英文混排时还额外提供按码点计算的位置 —— 后者才是你在编辑器里看到的光标位置。

完整分组信息

逐个列出所有捕获分组的值,可选分组未参与匹配时会明确显示「未参与匹配」而不是留空,这点在排查复杂正则时很关键。命名分组会同时标出名字。

替换预览

支持

amp;(整体匹配)、$1(分组引用)、
lt;name>(命名分组引用)三种语法,实时展示替换后的完整文本,不用先复制出去再试。

六种标志可自由组合

全局、忽略大小写、多行、点匹配换行、Unicode、粘滞,逐个开关,并实时显示对应的标志字符串。

灾难性回溯预警

(a+)+ 这类嵌套量词会让回溯次数指数级增长,轻易卡死浏览器。工具会识别并警告这类结构,同时设有执行时间预算,超时即中断。

超长文本自动保护

匹配条数与文本长度都有上限,达到后会明确提示「已截断」,而不是悄悄少显示结果或让页面失去响应。

怎么用

  1. 1

    输入正则

    在表达式框里输入,不用写两侧的斜杠。语法错误会立即提示,并指出是哪个位置的问题。

  2. 2

    选择标志

    按需勾选标志。多数场景需要「全局」才能看到所有匹配;处理中文文本时建议同时开启 Unicode 模式。

  3. 3

    粘贴测试文本

    把真实文本粘进来 —— 用真实数据试比用构造的例子更容易发现边界问题,比如开头的换行、结尾的空格。

  4. 4

    查看分组与替换

    对照分组值确认捕获是否正确,再用替换框验证预期的改写效果,两处都满意了再复制进代码。

参数说明

g(全局)
查找所有匹配而非只找第一个。开启后结果会列出全部匹配项。
i(忽略大小写)
匹配时忽略字母大小写,如 /abc/i 能匹配 ABC。
m(多行)
让 ^ 与 $ 匹配每一行的开头结尾,而不只是整个字符串的首尾。处理多行日志时几乎必开。
s(点匹配换行)
让 . 也能匹配换行符。默认情况下 . 不匹配换行,这是很多人「匹配不到跨行内容」的原因。
u(Unicode)
按 Unicode 码点而非 UTF-16 码元处理。开启后才能用 \u{1F600} 这样的码点转义,处理 emoji 与生僻汉字时应开启。
y(粘滞)
从 lastIndex 指定的位置开始匹配,且必须从该位置就匹配成功。适合写词法分析器。
起始位置
匹配片段在文本中的下标。中英混排时同时显示按码点计算的位置,后者与编辑器里的字符位置一致(emoji 只占 1 位)。

适用场景

  • 验证手机号、邮箱、身份证等格式的校验正则
  • 从日志里批量提取时间戳、IP、错误码
  • 调试 \b 与贪婪量词,确认边界是否符合预期
  • 测试替换规则的效果,如批量重命名
  • 检查正则在不同标志组合下的行为差异
  • 确认分组编号,避免 $1、$2 用错位置
  • 排查多行文本中 ^ 与 $ 为何没匹配上

常见问题

关于这个工具,你可能会问

为什么我的正则匹配不到跨行的内容?

因为默认情况下 . 不匹配换行符。有两种解决办法:开启「点匹配换行」(s 标志)让 . 能匹配换行,或者改用 [\s\S] 这样的字符类 —— 它天然包含换行,不依赖标志。前者更简洁,后者兼容性更好。

^ 和 $ 为什么没按预期匹配?

默认情况下 ^ 只匹配整个字符串的开头,$ 只匹配结尾。如果你的文本有多行、想匹配每一行的首尾,需要开启「多行」(m 标志)。处理多行日志时忘记开这个标志是最常见的失误。

什么是灾难性回溯?

当正则里出现嵌套量词(如 (a+)+)时,匹配失败一次的代价会随输入长度指数级增长。20 个字符可能只需要几千次尝试,30 个字符就要上亿次,浏览器会被彻底卡死。本工具会检测这类结构并给出警告,同时对每次匹配设置时间预算。

贪婪和惰性量词有什么区别?

贪婪(默认)会尽可能多匹配,惰性(加问号,如 .*?)尽可能少匹配。比如对 `a"b"c` 用 ".*" 会匹配到最外层的引号对,用 ".*?" 则匹配最近的引号对。前者更常用于需要跨越多个候选的情况,后者适合提取成对分隔符中的内容。

分组编号是怎么算的?

按左括号出现的顺序从 1 开始编号。形如 (?:...) 的非捕获分组不占编号,所以 (?:a)(b) 里 b 是第 1 组。推荐使用命名分组 (?<name>...),可读性更好也不会因改动顺序而失效。

为什么显示了「未参与匹配」的分组?

因为正则里的分支(如 (a)|(b))在某一处匹配时只会走其中一条路,另一条路对应的分组自然就没有值。工具明确标出「未参与匹配」而不是留空,是为了让你区分「分组存在但没匹配到」和「分组不存在」这两种情况。

Unicode 标志(u)有什么用?

它让正则按 Unicode 码点而非 UTF-16 码元处理。最直接的影响是:不开启时一个 emoji 会被当作两个字符,量词与字符类的行为都可能出错;同时只有开启后才能用 \u{1F600} 这类码点转义。处理中文与 emoji 时建议开启。

匹配结果会被上传吗?

不会。匹配与替换完全由浏览器的正则引擎在你本机执行,不存在网络请求。测试生产日志时也不必担心敏感信息外泄 —— 不过仍建议对日志中的密钥、手机号做脱敏处理。