正则表达式测试器
实时测试 JavaScript 正则表达式。匹配部分会高亮显示,捕获组也会列出。
高亮匹配
匹配与分组
- 在上方输入框中键入你的正则表达式(无需用斜线包裹)。
- 根据需要切换标志:g 表示全部匹配,i 表示忽略大小写,等等。
- 把测试文本粘贴或输入到「测试字符串」框中。
- 匹配会实时高亮,下方表格里可以查看捕获组的详情。
它能做什么?
这个测试器使用浏览器内置的 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 字符串里可选,但在 /.../ 字面量中必需),括号用 \( 和 \)。特殊字符有 . * + ? ^ $ { } ( ) | [ ] \ —— 当作字面文本使用时都需要转义。
你们会保存我在这里输入的正则或测试文本吗?
不会。你写的模式和用来测试的文本都不会被保存。你输入的一切都会在关闭或刷新标签页的瞬间被丢弃 —— 没有日志,我们这里也没有你匹配了什么的记录。如果想再确认一次,打开浏览器开发者工具看看就知道了。