正则表达式测试
在线测试正则表达式,实时匹配高亮并查看捕获组。输入表达式与测试文本即见结果,支持 g/i/m/s/u 修饰符与常用正则快捷插入,全程在浏览器本地运行。
使用说明
- 在「正则表达式」输入框中键入表达式,不需要包裹斜杠;如匹配日期可输入 \d{4}-\d{2}-\d{2}。
- 按需勾选修饰符:g 查找全部、i 忽略大小写、m 让 ^ 与 $ 匹配每行、s 让 . 匹配换行、u 启用 Unicode。
- 在下方的测试文本框中粘贴或输入内容,所有匹配会实时以高亮标出,表达式非法时也会即时提示。
- 「匹配详情」按顺序列出每一处匹配的完整文本与各个捕获组,方便核对分组是否正确。
- 需要参考时点击「常用正则」中的快捷项,即可把邮箱、URL、手机号等常用表达式填入输入框。
常见问题
为什么提示「无效的正则表达式」?
什么是捕获组?有什么用?
不勾选 g 时为什么只高亮一处?
我的文本会上传到服务器吗?
使用步骤
- 输入正则不加斜杠
在正则表达式框里直接书写表达式,首尾不要包斜杠。例如 \d{4}-\d{2}-\d{2} 匹配日期格式的文本。
- 按需勾选匹配标志
按需勾选:g 全局匹配找出全部结果,i 忽略大小写,m 使 ^ 与 $ 按行生效,s 让点号可以匹配换行。
- 粘贴文本看高亮结果
把待测试的内容粘贴进测试文本框,每一处匹配会实时高亮,表达式写错时会立即报出无效正则的提示。
- 查看匹配详情与捕获组
展开匹配详情列表,逐条查看每次匹配的完整文本与各组捕获内容,用来验证圆括号分组是否按预期提取数据。
- 用常用正则快速起步
不想从零写时,点常用正则里的邮箱、URL、手机号、IP 地址或日期按钮,载入现成表达式再按业务微调。
工具详细介绍
这是一个在浏览器里即时验证正则表达式的调试工具。左边写表达式、勾选标志,右边贴文本,所有匹配实时高亮,每处匹配的捕获组逐条列出。表达式语法有误时立即提示,不必再在代码里反复运行猜测。
适合在写数据提取规则前先验证分组,检查校验规则为什么没拦住某个输入,学习正则语法时观察每个符号的效果。从日志或文本里设计匹配模式时,也可以先在这里试。前后端开发者、测试工程师和数据分析师都能把它当作日常的正则试验台。
原理与背景
正则表达式源于 Stephen Kleene 在 1951 年提出的正则集理论。Ken Thompson 把它实装进 ed 编辑器,正则才走入工程。实现分两大流派:Thompson 构造的 DFA 引擎逐字符扫描、耗时稳定,但支持不了反向引用。JavaScript 采用带回溯的 NFA 引擎,表达力强,代价是遇到 (a+)+ 这类嵌套量词时,失败匹配可能触发指数级回溯。一行正则就能让页面卡死数分钟,也就是常说的灾难性回溯。
在 JavaScript 里书写正则还有转义的双轨制:字符串会先消化一层反斜杠。同一个 \d 在字面量里这样写没问题,放进 RegExp 构造函数就得写成 \\d。从字符串常量里复制出来的正则突然失效,多半栽在这里。另外 g 标志会让正则对象携带 lastIndex 状态,跨多次调用复用同一对象时匹配会跳位。量词默认贪婪,句尾加问号改为惰性后从短到长尝试,提取引号内内容这类任务里,两种写法的取值差别很大。
典型使用场景
- 设计数据提取规则
写爬虫或日志分析前,把候选正则和几段真实样本一起贴进来,逐条查看捕获组输出是否干净。边界情况当场暴露,比上线后在业务代码里反复修补省事得多。
- 排查校验规则漏放行
本该拦住的输入没被拦住时,把那条输入和校验正则一起贴进来复现。常见原因是漏了 ^ $ 锚点、忘了 i 忽略大小写,或字符类里少了要排除的符号,几分钟就能定位。
- 评估第三方正则的安全性
接入旧项目或第三方校验库时,把可疑表达式和一条超长的不匹配文本一起测。高亮迟迟不出或页面卡顿,就存在回溯失控的隐患,要改写表达式结构,而不是加服务器配置。
使用技巧
- 没勾 g 时只匹配第一处;想让文本中所有匹配都高亮,记得勾选 g 全局匹配。
- 报无效正则多是括号没闭合或量词前缺少可重复对象,例如 ([a-z]+ 少了右括号,按提示检查即可。
- 圆括号会单独捕获内容,例如 (\d{4})-(\d{2}) 可分别取出年份与月份,写提取规则前先在此验证。
注意事项
- 嵌套量词引发指数回溯
(a+)+、(\w+)* 这类嵌套量词遇到先大量匹配、随后失败的文本时,会产生指数级回溯。浏览器可能因此假死。测试这类表达式前先准备一条超长的不匹配样本,控制风险。
- 校验正则缺少锚点
不加 ^ $ 的正则会从长文本的任意位置抠出片段,校验手机号时连订单号里的连续 11 位也能通过。校验类表达式务必首尾锚定,或用 \b 限定单词边界。
- 不可见字符导致失配
全角空格、不换行空格(\u00A0)混进测试文本时,看起来正确的正则会意外失配。用 \s 代替字面空格能顺带覆盖这类字符,仍失配时先清理文本来源再定位。