正则表达式测试工具

输入正则表达式与测试文本,实时查看匹配结果、捕获组与统计信息

/ /

常用正则库(点击填入)

正则表达式常用语法速查

元字符含义示例
.匹配任意单个字符(除换行)a.c 匹配 abc
\d匹配数字 0-9\d{3} 匹配 123
\w匹配字母、数字、下划线\w+ 匹配 hello
\s匹配空白字符\s+ 匹配空格/换行
^匹配行首^Hello 匹配行首 Hello
$匹配行尾end$ 匹配行尾 end
*匹配 0 次或多次ab*c 匹配 ac, abc
+匹配 1 次或多次ab+c 匹配 abc
?匹配 0 次或 1 次colou?r 匹配 color
{n,m}匹配 n 到 m 次\d{2,4} 匹配 2-4 位数字
[abc]匹配方括号内任一字符[aeiou] 匹配元音
(...)捕获组,提取匹配内容(\d+) 提取数字
|或运算cat|dog 匹配 cat 或 dog

修饰符说明

g(全局):查找所有匹配,而非停在第一个;i(忽略大小写):不区分大小写匹配;m(多行):使 ^$ 匹配每行开头和结尾;s(单行):使 . 匹配换行符;u(Unicode):正确处理 Unicode 字符和码点。

正则表达式测试工具常见问题

为什么 \d 匹配不到全角数字"123"?

因为 \d 在 JavaScript 里默认只匹配 ASCII 的 0-9,全角数字"123"、中文数字"一二三"都不在范围内。要匹配任意 Unicode 数字,需要改用 \p{N} 并勾选 u(Unicode)修饰符,例如 /[\p{N}]+/u。同理,\w 默认也不包含中文和全角字符,只匹配字母、数字、下划线,处理中文文本时这一点经常被忽略。

为什么 <.+> 一次匹配了整段 HTML,而不是第一个标签?

因为量词 + 和 * 默认是贪婪的,会尽可能多地匹配字符。对 <div>a</div><p>b</p> 使用 <.+>,它会从第一个 < 一路吃到最后一个 >。改成懒惰量词 <.+?>(在量词后加问号)就只匹配最少字符,可以逐个匹配标签。遇到"取到的结果比预期长"的困惑,先检查是不是贪婪匹配在起作用。

勾选 g 修饰符和不勾选,匹配结果有什么差别?

不勾选 g 时,工具只执行一次匹配,返回第一个命中;勾选 g 后会遍历全文找出所有匹配,右侧的匹配次数统计、文本高亮和结果列表都基于全部匹配结果。所以同一个正则,勾不勾 g 看到的数量和位置可能完全不同。想确认整段文本里到底有几次命中必须勾 g;只想知道是否存在匹配,则可以取消 g 看首条结果。

正则在这个工具里能跑,为什么放到 Python 或 Java 里就报错?

本工具运行的是 JavaScript(ECMAScript)正则引擎,不同语言的引擎语法并不完全一致。例如命名捕获组 JavaScript 写作 (?<name>),Python 却用 (?P<name>);JavaScript 支持后行断言,而某些旧版本环境不支持;\d 在 JavaScript 只匹配 ASCII 数字,在 Python 3 中默认匹配 Unicode 数字。建议把本工具当作 JS 正则的验证器,移植到其他语言前先对照该语言的官方文档检查语法差异。

为什么内置的手机号、邮箱预设正则匹配不到我粘贴的内容?

预设只是常用基础版本,带有明确的边界假设。比如手机号预设 ^1[3-9]\d{9}$ 只匹配 11 位纯数字、以 1 开头的国内号码,带 +86 前缀或中间有空格、连字符的写法都不会命中;邮箱预设受限于常见格式,无法覆盖所有合法域名和国际化域名。生产环境请依据真实业务规则改写,并用大量真实样本做回归测试,不要直接照搬预设。