当前语言: 中文 切换为英文

正则表达式测试器

实时测试 JavaScript 正则表达式。匹配部分会高亮显示,捕获组也会列出。

/ /

高亮匹配

 

匹配与分组

  1. 在上方输入框中键入你的正则表达式(无需用斜线包裹)。
  2. 根据需要切换标志:g 表示全部匹配,i 表示忽略大小写,等等。
  3. 把测试文本粘贴或输入到「测试字符串」框中。
  4. 匹配会实时高亮,下方表格里可以查看捕获组的详情。
它能做什么?

这个测试器使用浏览器内置的 RegExp 引擎运行你的模式 —— 与 Node.js、Deno 以及所有浏览器使用的引擎完全相同。匹配部分会直接高亮。带编号和带命名的捕获组都会提取到表格中,方便你看清每个括号究竟捕获了什么。

示例

模式(带 g 标志):

\b(\w+)@(\w+\.\w+)\b

测试字符串:

Contact us at [email protected] or [email protected]. Not an email: foo@bar (no TLD).

匹配:

1  [email protected]        $1: hello    $2: example.com
2  [email protected]   $1: support  $2: happycoder.dev

foo@bar 不会匹配,因为 \w+\.\w+ 要求域名中必须有点。

为什么我的正则匹配不上?

  • 忘了加 g 标志。 没有 g,只会返回第一个匹配。/cat/.exec("cat cat") 只找到一个 "cat";/cat/g 能找到两个。
  • 元字符没有转义。 example.com 也会匹配 examplexcom,因为 . 可以匹配任意字符。用反斜线转义:example\.com。
  • 贪婪匹配吞得太多。 在 <a><b> 上运行 <.*> 会把整段都捕获。改用懒惰的 <.*?> 或否定类 <[^>]*>,让它在第一个 > 就停下。
  • 单词边界混淆。 \b 是单词字符和非单词字符之间的位置。像 \bfoo-bar\b 这样的模式会失败,因为中间的 - 本身就是非单词边界。
  • 大小写不匹配。 [a-z]+ 匹配不了 Hello。加上 i 标志,或者换成 [A-Za-z]+。
  • 多行的 ^ / $。 没有 m 标志时,它们只绑定到整个字符串的起止,而不是每一行。扫描日志时请打开 m 标志。
常见问题

这个测试器使用哪种正则风格?

JavaScript(ECMAScript)正则,直接使用浏览器内置的 RegExp 引擎。这与 PCRE(PHP、Perl)、Python 的 re 模块和 POSIX 正则有若干差异:不支持递归;没有占有量词;命名分组使用 (?<name>...) 而不是 (?P<name>...);像 \d 这种字符类简写默认只匹配 ASCII,除非加上 u 标志。

支持后行断言(lookbehind)吗?

支持。(?<=foo)bar 和 (?<!foo)bar 这类后行断言在 ES2018 中加入,在当前的 Chromium、Firefox、Safari 中都可用。如果你的生产环境需要兼容非常老的浏览器,请先到 caniuse 查一下 —— 但本测试器本身完全支持。

g、i、m、s、u 这些标志都代表什么?

g 查找所有匹配而不只是第一个。i 让匹配不区分大小写。m 让 ^ 和 $ 分别匹配每行的起止,而不是整串。s(dotall)让 . 也能匹配换行。u 启用完整的 Unicode 处理与更严格的转义解析。只挑你需要的标志 —— 其中 g 对匹配数量影响尤其大。

为什么我的贪婪量词匹配了太多?

*、+、{n,} 等量词默认是贪婪的 —— 会尽量多匹配,仅当后续模式失败时才回退。加一个 ? 让它们变成懒惰的:.*? 尽量少匹配。<a>.*</a> 穿越多个标签的常见修复是 <a>.*?</a> 或否定类 <a>[^<]*</a>。

如何在模式或替换字符串中引用捕获到的分组?

在模式内,用 \1、\2 等引用之前分组捕获到的同一段文字 —— (\w+)\s+\1 可以匹配重复的单词。在替换字符串(此实时测试器不支持,但 String.replace 支持)中使用 $1、$2。命名分组在模式中用 \k<name>,在替换中用 $<name>。

当模式里有点、斜线或括号时,为什么会出错?

这些是正则的元字符。要按字面匹配,用反斜线转义:点用 \.,斜线用 \/(在 new RegExp 字符串里可选,但在 /.../ 字面量中必需),括号用 \( 和 \)。特殊字符有 . * + ? ^ $ { } ( ) | [ ] \ —— 当作字面文本使用时都需要转义。

你们会保存我在这里输入的正则或测试文本吗?

不会。你写的模式和用来测试的文本都不会被保存。你输入的一切都会在关闭或刷新标签页的瞬间被丢弃 —— 没有日志,我们这里也没有你匹配了什么的记录。如果想再确认一次,打开浏览器开发者工具看看就知道了。