开发编码 本地计算 开箱即用 内置示例 不留痕迹

正则表达式测试器

输入正则与测试文本,实时高亮所有匹配片段并列出每个匹配的捕获组、命名组与位置。支持 gimsuy 标志位组合,零宽匹配自动防死循环,正则在浏览器本地用原生引擎执行,文本不上传。

正则表达式测试器用来验证一条表达式是否按预期匹配:输入表达式、标志位与测试文本,匹配片段实时高亮,同时列出每个匹配的位置与捕获组内容。适合在写校验规则(邮箱、手机号、URL、日志解析)时先验证再落代码,避免上线后才发现多匹配或漏匹配。

工具按 JavaScript RegExp 语法执行,标志位可组合 g、i、m、s、u、y,内部始终以全局方式扫描以列出全部匹配。要注意各语言方言有差异:PHP PCRE、Python re 与 JS 在命名组写法((?<name>…) 与 (?P<name>…))、后行断言支持度上并不一致,迁移正则时需要逐条核对。

使用步骤

  1. 第一格写表达式(不带两端的斜杠),第二格写标志位,可留空(默认按 g 处理)。
  2. 第三格粘贴测试文本,任一处改动都会立即重新匹配,不需要点按钮。
  3. 先看高亮确认匹配范围,再对照明细表核对捕获组与命名组是否取到预期内容。
  4. 报语法错误时检查括号与转义:匹配字面量点号要写 \. ,字符组内的多数符号无需转义。

计算原理与示例

输入格式

三个输入框分别填正则表达式、标志位(可留空,默认 g)和测试文本。任意一处修改都会立即重新匹配,无需点击按钮。正则按 JavaScript RegExp 语法书写,如 \d{4}-\d{2}-\d{2}。

标志位

标志位可组合使用:g 全局、i 忽略大小写、m 多行、s 点号匹配换行、u Unicode、y 粘性匹配。工具内部始终按全局模式扫描以便列出全部匹配,单个匹配的语义不受影响。

结果解读

结果区按原文顺序高亮匹配片段;明细表列出每个匹配的内容、起始位置与捕获组($1、$2…),命名组同样按序号列出。未参与匹配的可选组会标注「未参与匹配」。

代码示例

JavaScript 取出全部匹配与捕获组

// 全局匹配并遍历
const re = /(\d{4})-(\d{2})-(\d{2})/g;
for (const m of "日期 2026-09-14 与 2026-10-01".matchAll(re)) {
  console.log(m[0], m[1], m[2], m[3]); // 2026-09-14 2026 09 14
}

// 命名组
const named = /(?<y>\d{4})-(?<m>\d{2})/.exec("2026-09");
named.groups.y; // "2026"

Shell 命令行里校验与提取

# grep -E 校验邮箱格式
printf "a@b.com\nnot-an-email\n" | grep -E "^[^@]+@[^@]+\.[a-z]{2,}$"

# sed 提取并改写日期(注意不同实现的方言差异)
echo "2026-09-14" | sed -E "s/([0-9]{4})-([0-9]{2})-([0-9]{2})/\1年\2月\3日/"

常见问题

gimsuy 标志位分别是什么意思?

g 全局匹配(找出所有而不是第一个);i 忽略大小写;m 让 ^ $ 匹配每行的行首行尾;s 让 . 也能匹配换行符;u 启用 Unicode 完整匹配(处理代理对);y 粘性匹配(只从 lastIndex 处开始)。可任意组合,如 gi。

捕获组和命名组怎么查看?

正则里用圆括号包住的部分是捕获组,按左括号顺序编号($1、$2…);(?<名字>…) 形式是命名组。明细表按编号列出每个匹配对应的组值,值为 null 表示该组未参与匹配(比如可选分支没走到)。

为什么我的正则报语法错误?

常见原因:括号或方括号不配对、量词前面没有可作用的内容(如 *abc)、转义不完整(字面量点号要写 \. 而不是 .)。工具直接使用浏览器原生 RegExp 引擎,报错即语法确实不合法,可逐段注释排查。

测试文本会被上传吗?

不会。匹配在浏览器里用原生 RegExp 完成,文本与正则都不经过服务器,断网可用。可以放心粘贴日志、接口返回等含敏感信息的内容。

贪婪匹配和懒惰匹配的区别?

量词默认贪婪,尽可能多吃字符:<.+> 会把 <a><b> 整个吃掉;加 ? 变懒惰,尽可能少吃:<.+?> 只匹配到第一个 >。处理 HTML、引号内容时通常用懒惰匹配,或用 [^>] 这类排除字符集更精确。

零宽匹配是什么?

匹配内容为空字符串的匹配:a* 在没有 a 的位置也匹配成功,连空文本也会匹配出一个空串。这类匹配如果每次都从同一位置继续找,就会一直停在原地,所以工具内部对零宽匹配强制前进一位。实测:a* 对空文本得到 1 个空匹配(位置 0),对 bbb 得到 4 个(位置 0、1、2、3)。

支持反向引用和环视吗?

支持。反向引用 \1 引用第一个捕获组;环视 (?=…) (?!…) (?<=…) (?<!…) 在现代浏览器全部可用,命名反向引用写 \k<名字>。这些语法都由浏览器原生引擎执行,与控制台里 new RegExp 的行为完全一致。

延伸阅读

来自本站原创文章,讲清这个工具背后的算法与口径。