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