正则测试器
在浏览器中实时测试 JavaScript 正则表达式。高亮匹配项、显示捕获组,支持所有标志。
完全免费
无需注册
浏览器内完成
5 种语言
深色模式
/
/
高亮结果
匹配详情
常用模式
如有问题或显示异常,请通过以下方式联系我们: 联系表单。
📖 常见的坑
使用 JavaScript 的正则引擎实时求值,高亮匹配位置并列出捕获组。处理全部在浏览器内完成。这里用的是 JavaScript 方言——在这里能通过的模式,未必能原样在 PHP、Python、Go 中工作,因为字符类的含义、是否支持后行断言、Unicode 的处理方式,各语言各不相同。
| 情形 | 会发生什么 | 怎么处理 |
|---|---|---|
| 加了 g 标志后,第二次调用结果就变了 | 带 g 标志的正则对象持有 lastIndex 这一状态。对同一个对象反复调用 test(),它会从上次匹配的位置继续查找,于是同一个字符串会在 true 与 false 之间交替。当正则被定义在模块顶层并被复用时,这就致命了:状态会跨请求残留,产生「偶尔本不该通过却通过了」的校验,而且无法复现。只调用一次的测试根本抓不到它。 |
用于 test() 或 exec() 的正则,不要加 g。人们常出于「想匹配全部」的意图去加,但 test() 问的是「有没有至少一个」,g 是多余的。要取出全部匹配,请使用 str.matchAll(re)(它反而必须带 g)。若共享对象确实需要 g,请在每次调用前设置 re.lastIndex = 0。另外,把正则字面量写在函数内部、每次重建的开销可以忽略——引擎会缓存正则字面量,因此不共享更安全,性能几乎没有差别。 |
| 中日文与表情符号匹配得不如预期 | \w 只表示 ASCII 的字母、数字和下划线——它绝不匹配中日文。\b(单词边界)出于同样原因,在中日文文本中也不会按预期工作。更严重的是代理对:不加 u 标志时,表情符号与某些生僻汉字(如 𠮷、𩸽)会被当作两个字符,于是 . 只匹配到其中一半,而 [𠮷] 这样的字符类会变成「这两个代理项之一」这种莫名其妙的集合。字数统计或截断导致文字损坏,原因几乎都在这里。 |
请务必加上 u 标志。仅此一项就能让代理对被当作一个字符,并且解锁 \p{...} 这一 Unicode 属性转义。中日文可用 \p{Script=Hiragana}、\p{Script=Katakana}、\p{Script=Han}——比 [ぁ-んァ-ヶ一-龠] 这类范围写法更准确,意图也一目了然。处理表情符号可用 \p{Extended_Pictographic},但肤色与家庭类表情是多个码点的组合,要把它当作一个字符就需要 Intl.Segmenter——正则能做到的有限。若目的是统计字数,请用 Intl.Segmenter 而非正则。 |
| 贪婪匹配吞掉了远超预期的内容 | .* 会尽可能长地匹配。因此把 <.*> 用在 <div>A</div><div>B</div> 上,会得到从第一个 < 一直到最后一个 > 的单个匹配。由于 . 默认不匹配换行,多行时它会在行尾止住,但一旦加上 s 标志,它就会吞掉整个文件。这个行为本身是正确的;问题在于,一旦与预期不符,它表现为测试通过,却在生产环境更长的输入上崩掉。 |
请改用惰性的 .*?;更好的写法是用否定字符类,例如 [^>]*——后者不会回溯,因此更快,意图也更清晰。不过更根本的建议是:不要用正则解析 HTML——属性值内的 >、注释、CDATA、同名嵌套标签,都会让它崩溃。浏览器请用 DOMParser,服务端请用各语言的真正 HTML 解析器。正则适合的是「以行为单位、没有结构、格式确定」的文本——一行日志、配置文件的一行、校验标识符的格式。凡是带嵌套的结构,都在正则的职责范围之外。 |
嵌套量词是 ReDoS 的温床。像 (a+)+$、(\w+\s?)*$ 这种「重复中还有重复」的表达式,对不匹配的输入会耗费指数级时间——三十来个字符的输入,就足以让服务器 CPU 满载数分钟。讽刺的是,它出现最多的地方恰恰是「严格的」邮箱校验正则,并且已不止一次成为大型服务故障的元凶。防御手段有三:不要写嵌套量词、限制输入长度,以及使用不回溯的引擎——Go 标准库的 regexp、Rust 的 regex、或 RE2。方言差异也请记牢:JavaScript 没有 \A 与 \z,需以不带 m 标志的 ^ 与 $ 代替。后行断言在 ES2018 引入,但 Safari 直到 16.4 才支持,若需兼容较旧环境请避免使用。
📖 使用方法
-
1
输入模式输入正则表达式并切换标志。
-
2
粘贴测试文本粘贴目标文本,匹配项会实时高亮。
-
3
查看捕获组右侧面板显示每个匹配的位置和捕获组值。
❓ 常见问题
使用的正则引擎是什么?
使用浏览器的 JavaScript 引擎。
可以匹配日文字符类吗?
是。使用 Unicode 属性转义,需要 u 标志。
性能如何?
直接使用 JS 引擎,非常快。
可以转换为其他语言的代码吗?
使用"复制为代码"菜单导出各语言的代码。
🐛 此工具出现问题了吗?
免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。
✅
感谢您的反馈!
已送达运营者,将用于改进工具。