🔍正则表达式测试 - 在线 Regex 匹配与高亮工具
实时测试 JavaScript 正则表达式:输入正则和测试文本,所有匹配立即在文本里高亮,并逐条列出位置和捕获分组。命名分组显示名字($1 <year>),没参与匹配的分组和匹配到空字符串的分组分开标出;\b、^、(?=…) 这类零宽匹配用竖线标出位置。从 JS 代码里复制的 /hello/gi 整段粘贴进来会自动拆成正则和标志。匹配在后台线程里运行,写出 (a+)+ 这种会疯狂回溯的正则,超过 1.5 秒会自动停止并提示原因,页面不会卡死。支持 g、i、m、s、u 五个标志,全部在浏览器本地运行,文本不上传。
正在加载工具...
如何使用正则测试
- 1输入正则表达式,或者把代码里的 /…/flags 整段粘贴进来,标志会自动勾上
- 2在测试文本框粘贴要匹配的内容
- 3看高亮结果和下面的分组列表;不勾选「全局 g」时只找第一处
- 4提示回溯太多时,改掉嵌套量词或缩短文本再试
常见问题
- 用的是哪种正则语法?和 Python、Java、PHP 一样吗?
- 是 JavaScript(ECMAScript)语法,和浏览器、Node.js 完全一致,常用部分(字符类、量词、分组、断言、反向引用)和其他语言基本相同。在当前 Chrome 上实测,几处常见差别:Python 的命名分组 (?P<name>…) 会报错,要写成 (?<name>…);开头写 (?i) 打开忽略大小写会报错,要勾选 i 标志,或用 (?i:…) 只作用于一段;占有量词 a++ 和原子组 (?>…) 都不支持;JS 支持任意长度的向后断言 (?<=a+),这点比 Python、Java 宽松。
- \A、\Z、\p{…} 为什么不报错却匹配不到?
- 不勾选 u 标志时,JS 把不认识的转义当成字母本身:\A 就是字母 A,所以 \Aabc\Z 匹配不到 abc,反而能匹配 AabcZ(实测如此);\p{Script=Han} 也会被当成字面的 p{Script=Han}。JS 里用 ^ 和 $ 表示开头结尾。勾选 u 后,\p{Script=Han} 能匹配汉字(「祈灵tools中文😀」里匹配到 4 个),\A 这类无效转义则会直接报错,更容易发现写错。
- 为什么 . 匹配不到换行,\w 匹配不到中文?
- . 默认不匹配换行符,要跨行匹配请勾选「点匹配换行 s」;^ 和 $ 默认只认整段文本的开头结尾,要按行匹配请勾选「多行 m」,实测 ^\w$ 在 a 换行 b 里不勾 m 是 0 处、勾上是 2 处。\w 只包括英文字母、数字和下划线,不包括汉字,匹配中文请用 [\u4e00-\u9fa5],或者勾选 u 后用 \p{Script=Han}。表情符号在 JS 里占两个单位,不勾 u 时 ^.$ 匹配不到一个 😀,勾上 u 才能。
- 提示「回溯太多,已停止」是怎么回事?
- 有些正则遇到匹配不上的文本时,会把所有拆分方式试一遍,耗时成倍增长,俗称灾难性回溯。实测 (a+)+$ 去匹配「一串 a 加一个 b」:20 个 a 用 16 毫秒,22 个用 52 毫秒,24 个用 189 毫秒,每多两个字母约慢 4 倍,40 个 a 要算几个小时。本工具在后台线程里匹配,超过 1.5 秒就停掉并提示,页面不会卡。常见原因是嵌套量词,如 (a+)+、(\w+\s?)*、(.*)*,改成不嵌套的写法通常就能解决。同样的正则放进服务端代码,也可能被恶意输入拖垮(ReDoS)。
- 命名分组、未参与匹配是什么意思?
- 分组列表里每个括号对应 $1、$2……,写成 (?<year>\d{4}) 的命名分组会显示为 $1 <year>,替换时可以用 $<year> 引用。「未参与匹配」表示这个分组所在的分支没有走到,比如 (a)|(b) 匹配到 b 时第 1 组就是这样,在代码里它的值是 undefined;「空字符串」表示分组参与了但匹配到 0 个字符,比如 a(b*)c 匹配 ac。这两种在代码里的判断方式不同,所以分开显示。
- 粘贴 /abc/gi 会怎样?想匹配斜杠本身怎么办?
- 从 JS 代码里复制的整段 /…/标志 粘贴进正则框时,工具会把斜杠里面的部分当作正则、后面的字母勾成标志,并提示拆开了什么;本工具不支持的 y、d、v 标志会提示已忽略。只有整段粘贴时才拆开,手动输入的 /api/ 仍按字面匹配斜杠,实测在「GET /api/users」里能找到 1 处。
- 匹配很多时会显示全部吗?
- 最多列出 10000 处匹配,超过时会提示后面还有更多没有显示(实测 2 万个字符用 . 匹配,显示前 10000 处并给出提示)。要统计更多,可以把文本分段测试,或者在代码里直接运行。
- 文件会上传服务器吗?
- 不会。所有处理都在你的浏览器本地完成,没有任何网络上传,关闭页面即清除。
- 需要注册或付费吗?
- 不需要。本站完全免费,无需注册登录,没有次数限制。
功能特点
- 实时高亮所有匹配,零宽匹配用竖线标出位置
- 列出每处匹配的位置和捕获分组,命名分组显示名字
- 区分「未参与匹配」和「空字符串」两种空分组
- 粘贴 /…/gi 写法自动拆成正则和标志
- 匹配在后台线程运行,超过 1.5 秒自动停止,页面不会卡死
- 支持 g/i/m/s/u 标志,语法错误即时提示,本地运行不上传