跳到内容

正则测试器

在浏览器中实时测试 JavaScript 正则表达式。高亮匹配项、显示捕获组,支持所有标志。

完全免费 无需注册 浏览器内完成 5 种语言 深色模式
/ /

高亮结果

匹配详情

常用模式

如有问题或显示异常,请通过以下方式联系我们: 联系表单

📖 常见的坑

使用 JavaScript 的正则引擎实时求值,高亮匹配位置并列出捕获组。处理全部在浏览器内完成。这里用的是 JavaScript 方言——在这里能通过的模式,未必能原样在 PHP、Python、Go 中工作,因为字符类的含义、是否支持后行断言、Unicode 的处理方式,各语言各不相同。

情形 会发生什么 怎么处理
加了 g 标志后,第二次调用结果就变了 g 标志的正则对象持有 lastIndex 这一状态。对同一个对象反复调用 test()它会从上次匹配的位置继续查找,于是同一个字符串会在 truefalse 之间交替。当正则被定义在模块顶层并被复用时,这就致命了:状态会跨请求残留,产生「偶尔本不该通过却通过了」的校验,而且无法复现只调用一次的测试根本抓不到它。 用于 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. 1
    输入模式
    输入正则表达式并切换标志。
  2. 2
    粘贴测试文本
    粘贴目标文本,匹配项会实时高亮。
  3. 3
    查看捕获组
    右侧面板显示每个匹配的位置和捕获组值。

❓ 常见问题

使用的正则引擎是什么?
使用浏览器的 JavaScript 引擎。
可以匹配日文字符类吗?
是。使用 Unicode 属性转义,需要 u 标志。
性能如何?
直接使用 JS 引擎,非常快。
可以转换为其他语言的代码吗?
使用"复制为代码"菜单导出各语言的代码。
🐛 此工具出现问题了吗?

免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。

※ 为复现问题,浏览器信息 (UA / 屏幕 / 语言 / URL) 将自动发送