跳到主要内容
AZ Tools

正则表达式测试器

写下正则表达式、切换标志位,输入的同时就能看到测试字符串中每一处匹配被高亮出来。每次匹配的捕获组会逐一列出,替换预览在旁边同步运行,因此你可以同时确认这个模式找到了什么、又会产出什么。引擎就是浏览器自带的 JavaScript RegExp,也就是说你在这里看到的,正是你的代码将要做的——包括 JavaScript 与 PCRE、Python 或 Go 有出入的那些地方。不会发送到任何地方:模式和测试数据都留在页面内,而当你调试的样本是真实数据时,这一点很重要。

标志
匹配项2 处匹配
Contact me at jane@example.com or john@test.io for details.
  • #1 @14jane@example.com
  • #2 @34john@test.io
替换预览
Contact me at [redacted] or [redacted] for details.

使用方法

  1. 输入正则表达式(不含分隔符)。
  2. 切换标志:g(全局)、i(忽略大小写)、m(多行)、s(dotall)、u(Unicode)。
  3. 输入或粘贴测试字符串——边输入边高亮。
  4. 提供替换字符串预览结果。

常见问题

采用哪种方言?
JavaScript (ECMAScript) 正则。现代浏览器支持后行断言、命名组、Unicode 属性转义。
替换中如何引用捕获组?
使用 $1、$2,完整匹配用 $&,命名组用 $<名称>。
有匹配上限吗?
为保持 UI 流畅最多捕获 10000 次迭代,列表显示前 50 个。
数据会发送吗?
不会。模式和测试字符串只在浏览器运行,自动保存仅存于本地存储。
为什么我的模式会让页面卡死?
几乎可以肯定是灾难性回溯。嵌套量词的模式——比如 (a+)+b——会迫使引擎在承认「不匹配」之前,尝试以指数级数量的方式去切分输入。解决办法是让内层不再有歧义,通常是把贪婪的 .* 换成一个不可能与分隔符重叠的否定字符类。
全局标志 g 究竟改变了什么?
没有 g 时,匹配在第一个结果处停止。有了 g,搜索会贯穿整个字符串,这正是匹配列表能多于一条的原因。同时它也让正则表达式在真实代码中带上了状态,因为它会记住上次停在哪里。这正是循环中复用同一个模式时、看起来每隔一个就漏掉一个匹配的常见原因。
怎样跨多行匹配?
涉及两个不同的标志,而且很容易混淆。多行标志改变的是锚点的含义,让 ^ 和 $ 在每个换行处都能匹配,而不只是在字符串首尾。dotAll 改变的是点号匹配什么,让它也能覆盖换行符。如果模式在第一行末尾就停住了,你通常想要的是 dotAll。

相关主题指南

相关工具