正则表达式测试

在线测试正则表达式,实时高亮匹配结果,列出捕获组,并可预览替换效果。使用 JavaScript 正则引擎。

正则表达式
匹配结果

如何测试正则表达式

  1. 在两条斜杠之间输入表达式,不要自己再加斜杠。反斜杠只写一次:写 \d,而不是代码字符串字面量里需要的 \\d。
  2. 勾选需要的标志。所选标志会显示在右斜杠之后,整行看起来与 JavaScript 正则字面量 /pattern/flags 完全一致。
  3. 把示例文本粘贴到测试文本中。匹配部分以两种颜色交替高亮,方便区分相邻的匹配,状态栏会显示匹配数量。
  4. 查看下方表格:每个匹配的起始位置(从 0 开始计数)以及每个捕获分组的内容。短横线(–)表示该分组没有参与这次匹配。
  5. 如有需要,输入替换内容,预览对整段文本执行查找替换后的结果。想逐行对比替换前后的文本,可以把两者粘贴到文本对比中。

如果表达式有语法错误,比如括号没有闭合,就会显示浏览器给出的错误信息,而不是结果。

标志说明

  • g · 全局——查找所有匹配。不勾选时只列出第一个匹配,替换也只替换第一处。
  • i · 忽略大小写——order 也能匹配 “Order” 和 “ORDER”。
  • m · 多行——^ 和 $ 不仅匹配整段文本的开头和结尾,也匹配每一行的开头和结尾。
  • s · 点号匹配换行——. 也能匹配换行符。
  • u · Unicode——把表情符号等基本多文种平面(BMP)之外的字符当作一个字符处理,并启用 \p{L} 这样的属性转义。语法也会更严格,一些随意的转义会变成错误。

示例

捕获分组与替换

页面默认载入的表达式 (\w+)@(\w+)\.com 会在位置 8 找到 [email protected],在位置 29 找到 [email protected],分组分别是 “alice”/“example” 和 “bob”/“test”。[email protected] 不以 .com 结尾,因此被跳过。把替换内容设为 $1 at $2,结果是 “Contact alice at example or bob at test.”。

改写日期格式

表达式 (\d{4})-(\d{2})-(\d{2}) 加上 g 标志,替换为 $3/$2/$1,会把 “Due 2026-11-05, paid 2026-12-01” 变成 “Due 05/11/2026, paid 01/12/2026”。改用命名分组 (?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2}) 和 $<d>.$<m>.$<y>,替换内容一看就懂:“05.11.2026”。

贪婪与非贪婪

对于 <b>bold</b> and <i>italic</i>,贪婪的 <.+> 会把整行当作一个匹配,因为 .+ 会尽可能多地吞下字符。加一个问号变成 <.+?> 就是非贪婪模式,会分别找到四个标签。

匹配任何语言的字母

\w 只包括 A–Z、a–z、0–9 和下划线,所以 \w+ 会把 “Café Zürich” 拆成 “Caf”、“Z”、“rich”,完全忽略 서울 和 東京。勾选 u 标志并使用 \p{L}+,就能完整匹配各种文字的单词:“Café”、“Zürich”、“서울”、“東京”。

速查表

.除换行符外的任意字符(勾选 s 时包括换行符)
\d \w \s数字 · 字母、数字或下划线 · 空白字符
\D \W \S分别与上面相反
[abc] [^abc] [a-z]列出的字符之一 · 除此之外的字符 · 范围
* + ? {2,5}0 次或多次 · 1 次或多次 · 可有可无 · 2 到 5 次
*? +?非贪婪版本:尽可能少地匹配
^ $ \b开头 · 结尾 · 单词边界
(…) (?:…) (?<name>…)捕获分组 · 非捕获分组 · 命名分组
(?=…) (?!…) (?<=…)后面紧跟 · 后面不跟 · 前面紧接
$1 $<name> $& $$替换内容中:分组 1 · 命名分组 · 整个匹配 · 字面的 $

常见陷阱

  • 忘记转义特殊字符。在 example.com 中,点号匹配任意字符,所以 “examplexcom” 也会匹配。应写成 example\.com。
  • 空匹配。像 x* 这样可以匹配空内容的表达式,会在每个位置都产生匹配:在 “abc” 上有 4 个空匹配。它们会被计数,但没有可高亮的字符。
  • 灾难性回溯。(a+)+$ 这类嵌套重复的表达式,在文本“差一点就能匹配”时会耗费指数级的时间,可能让浏览器标签页卡死。请让内层更具体,或去掉嵌套。
  • 以为其他语言表现相同。本页使用浏览器的 JavaScript 引擎,结果与 JavaScript、TypeScript 中的 match、matchAll、replace 一致。Python 的命名分组写作 (?P<name>…),替换中写作 \1 或 \g<name>;PCRE 和 Java 支持占有量词和原子分组,而 JavaScript 不支持。

常见问题

最多显示多少个匹配?

最多查找并高亮 10,000 个匹配;为保持页面流畅,表格只列出前 500 个。

为什么在这里能匹配,在我的代码里却不行?

通常是转义问题。在 JavaScript 字符串 "\d" 中反斜杠会丢失,应写成 "\\d" 或使用正则字面量。另外请检查代码中是否使用了相同的标志。

能用正则表达式验证邮箱地址吗?

只能粗略验证。^[^\s@]+@[^\s@]+\.[^\s@]+$ 这样的简单检查可以发现输入错误,但真正的验证方法只有发送确认邮件。

如何跨多行匹配?

使用 [\s\S],或勾选 s 标志让 . 包括换行符。如果反过来想让每一行单独作为锚定对象,请勾选 m。