正则表达式在线测试工具
免费在线正则表达式测试 —— 即时匹配高亮、分组捕获、文本替换与模式解说。配备完整语法速查表和 10 种实战模式,助力开发者高效编写和调试正则表达式。
🚀 立即使用正则测试什么是正则表达式?
正则表达式(Regular Expression,简称 regex 或 regexp)是一种由特殊字符和普通字符组成的模式匹配语言,用于在文本中查找、提取和替换符合特定规则的字符串。它的理论根基可追溯到 20 世纪 50 年代 —— 数学家 Stephen Cole Kleene 在 1951 年首次用数学符号描述了"正则集合"的概念。1968 年,Ken Thompson 将正则表达式引入 Unix 的 qed 编辑器,随后在 ed、grep、sed、awk 等工具中发扬光大。经过半个多世纪的发展,正则表达式已经成为每一位开发者工具箱中不可或缺的核心技能。
在日常开发中,正则表达式广泛应用于以下场景:
- 表单验证:校验用户输入的邮箱、手机号、身份证号、密码强度等是否符合格式要求,是前端和后端最常用的数据校验手段。
- 日志分析:从数 GB 的服务器日志中快速提取特定 IP 地址、错误码、接口路径和响应时间,配合 grep、awk 等命令行工具实现分钟级的故障定位。
- 搜索替换:在 VS Code、IntelliJ IDEA、Sublime Text 等 IDE 中,使用正则表达式进行跨文件批量查找和替换,比逐一手工修改效率提升数十倍。
- 数据清洗:从网页爬取的非结构化数据中提取结构化信息(如价格、日期、电话号码),去掉 HTML 标签和多余空白字符。
- 路由匹配:在 Web 框架(如 Express.js、Django、Flask)中,URL 路由规则本质上就是正则表达式的应用。
尽管正则表达式的语法初看晦涩——满屏的斜杠、括号和符号让人望而生畏——但一旦掌握其核心规则,你会发现它像一把瑞士军刀,在你面对各种文本处理任务时游刃有余。下方的速查表和实战示例将帮助你一步步构建自己的正则知识体系。
正则表达式标志(Flags)详解
正则标志(也叫修饰符)写在模式结束符 / 的后面,用于控制匹配的行为。理解每个标志的作用是写出正确正则的关键一步。以下是 JavaScript 正则引擎支持的五个核心标志:
| 标志 | 名称 | 作用说明 | 示例 |
|---|---|---|---|
g |
全局匹配(Global) | 查找所有匹配项,而非在找到第一个匹配后就停止。不加 g 时只返回第一个匹配结果。 |
/\d+/g 在 "a1b22c333" 中匹配 1、22、333;去掉 g 则只匹配 1 |
i |
忽略大小写(Case-Insensitive) | 匹配时不区分字母大小写。默认情况下 /abc/ 不会匹配 ABC。 |
/hello/i 可匹配 Hello、HELLO、hELLo 等任意大小写组合 |
m |
多行模式(Multiline) | 改变 ^ 和 $ 的行为:它们不仅匹配整个字符串的首尾,也匹配每一行的首尾(以换行符 \n 为界)。 |
/^#/m 在多行文本中匹配每一行以 # 开头的行,常用于解析 Markdown 标题或配置文件注释 |
s |
dotAll 模式 | 让点号 . 也能匹配换行符 \n。默认情况下 . 匹配除换行符外的任意字符。 |
/<div>.+?<\/div>/s 可以跨多行匹配 <div> 标签内的全部内容 |
u |
Unicode 模式 | 启用完整的 Unicode 支持,允许使用 \p{...} 来匹配 Unicode 属性(如 \p{Script=Han} 匹配中文字符),并正确处理四字节字符(如许多 emoji)。 |
/\p{Emoji}/gu 匹配文本中的所有 emoji 表情符号 |
标志可以组合使用,例如 /pattern/gimsuy 同时启用多个模式。最常用的组合是 gi(全局 + 忽略大小写)和 gm(全局 + 多行)。
常用正则语法速查表
以下表格涵盖了日常开发中 90% 以上的正则需求。建议收藏本页面,编写正则时随时查阅。
| 语法 | 说明 | 示例 | 示例说明 |
|---|---|---|---|
\d | 匹配一个数字字符(0-9) | \d{3} | 匹配 3 位数字,如 123 |
\w | 匹配一个单词字符(字母、数字、下划线) | \w+ | 匹配一个单词,如 user_name |
\s | 匹配一个空白字符(空格、制表符、换行符等) | \s* | 匹配零个或多个空白字符 |
. | 匹配除换行符外的任意单个字符 | a.b | 匹配 aab、a0b、a b 等 |
* | 匹配前面的表达式零次或多次(贪婪) | bo* | 匹配 b、bo、booo |
+ | 匹配前面的表达式一次或多次(贪婪) | bo+ | 匹配 bo、booo,但不匹配 b |
? | 匹配前面的表达式零次或一次(可选) | colou?r | 同时匹配 color 和 colour |
{n} | 精确匹配 n 次 | \d{4} | 匹配 4 位数字,如年份 2026 |
{n,m} | 匹配至少 n 次、最多 m 次 | \w{6,20} | 匹配 6 到 20 位字符的用户名 |
^ | 匹配字符串(或行)的开头 | ^https? | 匹配以 http 或 https 开头的字符串 |
$ | 匹配字符串(或行)的结尾 | \.html$ | 匹配以 .html 结尾的字符串 |
\b | 匹配单词边界(字母与非字母之间的位置) | \bcat\b | 匹配独立单词 cat,不匹配 catch 或 scattered |
[abc] | 匹配方括号中任意一个字符(字符类) | [aeiou] | 匹配任意一个元音字母 |
[^abc] | 匹配不在方括号中的任意字符(否定字符类) | [^0-9] | 匹配任意一个非数字字符 |
(...) | 捕获组:匹配并捕获括号内的表达式,可用 $1 反向引用 | (\w+)@(\w+) | 在 user@example 中捕获 user 和 example |
(?:...) | 非捕获组:匹配但不捕获,不占用 $1 等引用号 | (?:https?|ftp):// | 匹配协议前缀,但不创建捕获组 |
(?=...) | 正向前瞻断言:要求后续内容匹配括号内的表达式,但不消耗字符 | \d+(?=元) | 匹配后面紧跟"元"的数字,如 29元 中的 29 |
| | 交替(逻辑或):匹配竖线左边或右边的表达式 | jpg|png|gif | 匹配 jpg、png 或 gif |
除了以上基础语法,现代正则引擎还支持许多高级特性,如反向断言 (?<=...)、命名捕获组 (?<name>...) 以及 Unicode 属性转义 \p{...}。初学者建议先从上述核心语法入手,逐步深入。
十种实战正则模式
以下是 10 种经过实际项目检验的常用正则表达式,涵盖表单验证、数据处理和内容提取等典型场景。你可以直接复制使用,也可根据业务需求微调。
1. 电子邮件地址
正则: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
最常用的邮箱格式验证正则,匹配形如 user@example.com 的标准邮箱地址。注意:根据 RFC 5322 规范,邮箱格式远比这个模式复杂——支持加号标签、IP 域名字面量、引号包裹的本地部分等。上述模式覆盖了日常应用中 99% 以上的合法邮箱。
2. 中国大陆手机号码
正则: ^1[3-9]\d{9}$
匹配以 1 开头、第二位为 3 至 9、后跟 9 位数字的 11 位手机号码。涵盖中国移动、中国联通、中国电信和中国广电的所有号段(包含 130-139、150-159、180-199 等)。
3. URL 地址
正则: ^https?://[^\s/$.?#].[^\s]*$
匹配 HTTP 或 HTTPS 协议的 URL 地址,可覆盖带查询参数、锚点(hash)和端口号的完整 URL。如果仅需粗略匹配,可用简化版 https?://\S+。
4. IPv4 地址
正则: ^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$
精确匹配 0.0.0.0 到 255.255.255.255 范围内的合法 IPv4 地址。通过分段数值范围约束避免匹配到 999.999.999.999 这样的无效地址。
5. 日期格式(YYYY-MM-DD)
正则: ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
匹配 ISO 8601 标准日期格式(2026-05-08),限定月份为 01-12、日期为 01-31。注意此模式不校验每月的实际天数(如 2 月 30 日),如需严格校验建议在代码中结合 Date 对象使用。
6. 中国大陆身份证号码
正则: ^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$
匹配 18 位身份证号码,包含地区码(前 6 位)、出生日期(8 位)、顺序码(3 位)和校验位(1 位,可能为数字或 X)。如需验证校验位的正确性(ISO 7064:1983 MOD 11-2 算法),仍需代码层面计算。
7. 中国邮政编码
正则: ^[1-9]\d{5}$
匹配 6 位中国大陆邮政编码,首位不能为 0,范围从 010000 到 999999。精确到县级行政区划。
8. HTML 标签提取
正则: <(\w+)[^>]*>.*?<\/\1>
匹配一对完整的 HTML 标签及其内容。使用反向引用 \1 确保开始标签和结束标签的名称一致。注意:正则表达式不适合解析任意 HTML(HTML 不是正则语言),但对于提取特定标签或一次性轻量任务非常实用。
9. 匹配首尾空白字符
正则: ^\s+|\s+$
匹配字符串开头和结尾的所有空白字符(空格、制表符、换行符等)。在替换模式中将此正则替换为空字符串,即可实现类似 JavaScript trim() 方法的效果。
10. 十六进制颜色代码
正则: ^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
匹配 CSS 中的十六进制颜色代码,支持三位简写(#FFF)和六位完整格式(#1E90FF)。通过限定字符为 0-9、a-f、A-F 来确保输入是合法的 HEX 颜色值。
三种核心功能详解
1. 匹配模式(Match)
在输入文本中搜索所有匹配正则表达式的子串,并以不同的颜色高亮显示每个匹配项和捕获组内容。匹配模式下你可以查看:
- 每个匹配的完整内容及其在原文中的起止索引位置
- 所有捕获组(括号
()内的内容)的独立值,用不同颜色区分 - 匹配总数和匹配耗时,方便评估正则性能
适用场景:从日志中提取关键信息、验证正则表达式是否正确匹配、分析分组捕获结果。
2. 替换模式(Replace)
将正则匹配到的内容替换为指定文本。支持 $1、$2、$3 等反向引用,可将捕获组内容插入到替换结果中,灵活重组文本格式。
示例: 将日期从 2026-05-08 转换为 2026年05月08日
正则: (\d{4})-(\d{2})-(\d{2})
替换为: $1年$2月$3日
结果: 2026年05月08日
适用场景:批量格式化文本(统一日期格式、手机号脱敏)、清理数据(去掉 HTML 标签、移除多余空格)、代码重构中批量修改变量命名等。
3. 模式解说(Explain)
将正则表达式解析为人类可读的逐步说明,逐行解释每个语法元素的含义。例如输入 ^\w+@\w+\.\w+$,工具会告诉你:^ 是行首锚点、\w+ 匹配一个或多个单词字符、@ 是字面量 at 符号……这对于初学者理解复杂正则表达式、或在代码审查中快速解读他人写的正则非常有帮助。
适用场景:学习正则语法、代码审查时理解他人写的模式、排查正则未按预期工作的原因。
常见正则错误与避坑指南
1. 贪婪匹配 vs. 懒惰匹配
这是初学者最容易踩的坑。默认情况下,*、+、{n,} 等量词是贪婪的——它们会尽可能多地匹配字符。在量词后面加上 ? 可以将其变为懒惰匹配,即尽可能少地匹配。
文本: <div>标题</div><div>内容</div> 贪婪: <div>.*<\/div> → 匹配整个字符串(从第一个 <div> 到最后一个 </div>) 懒惰: <div>.*?<\/div> → 分别匹配两个 <div> 块
实用建议:提取两个分隔符之间的内容时,几乎总是使用懒惰匹配 .*?,除非你明确需要贪婪行为。
2. 忘记转义特殊字符
正则中有 12 个保留元字符:^ $ . * + ? ( ) [ ] { } | \。如果要匹配这些字符本身的内容(而非它们的特殊含义),必须在前面加上反斜杠 \ 进行转义。
错误: example.com → . 会匹配任意字符,可能匹配到 exampleXcom 正确: example\.com → . 被转义为字面量点号
如果不确定某个字符是否需要转义,可以先在方括号中使用(大多数元字符在 [] 内自动失去特殊含义,但 ^、-、]、\ 仍需注意)。
3. 忽略了 ^ 和 $ 锚点
如果没有使用 ^ 和 $ 锚点来限定字符串的起止位置,正则可能会匹配到意想不到的中间子串——这种情况在表单验证场景中尤其危险。
文本: abc123def
正则 \d{3} → 匹配 123 ✅(这是我们期望的)
正则 ^\d{3}$ → 不匹配(因为整个字符串不是纯数字)
验证输入时,始终使用完整的起止锚点。例如邮箱验证应该用 ^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$ 而非去掉 ^ 和 $ 的版本。
4. 过度使用 .* 导致性能问题
用 .* 匹配长文本时,贪婪引擎会产生大量回溯(backtracking),在极端情况下(如嵌套结构)可能引发灾难性回溯(Catastrophic Backtracking),导致浏览器卡死。典型的危险模式如 (a+)+b 匹配 "aaaaaaaaaaaaaaaaaaaaac",回溯次数随字符串长度呈指数级增长。优化方法是尽量使用更精确的字符类(如 [^"]* 代替 .*),并限制重复范围。
常见问题
- .* 和 .*? 有什么区别?
.*是贪婪匹配,会尽可能多地吞掉字符,直到整个模式仍能匹配为止。在字符串<a>文本一</a><a>文本二</a>中,<a>.*</a>会从第一个<a>匹配到最后一个</a>,得到整段内容。.*?是懒惰匹配,每次都只吞掉最少的字符,所以会分成两个独立的匹配。一句话总结:需要提取两个标记之间的内容,用.*?;需要从开头吃到结尾,用.*。- 为什么我的正则表达式在测试工具中正常,但在 JavaScript 代码中报错?
- 最可能的原因是字符串转义问题。在 JavaScript 中,正则可以写成字面量
/pattern/flags,也可以写成字符串new RegExp("pattern","flags")。用字符串构造时,反斜杠\本身需要再转义一次(即写成\\)。例如new RegExp("\\d+","g")而不是new RegExp("\d+","g")。建议优先使用字面量语法,避免双重转义的困扰。 - 为什么我的正则匹配到了太多内容?
- 这通常意味着你使用了贪婪量词而没有加锚点或边界限制。请检查以下三点:第一,是否在需要精确提取时误用了
.*而非.*?;第二,是否缺少^和$锚点来限制匹配范围;第三,模式中的字符类范围是否过大(如\w是否包含了你不想要的字符)。你可以把原始文本和模式粘贴到本工具中逐步调试,观察每个匹配的实际边界。 - 正则表达式默认区分大小写吗?
- 是的,正则表达式默认区分大小写。
/hello/只会匹配hello,不会匹配Hello或HELLO。如果不希望区分大小写,需要添加i标志:/hello/i。另外还需要注意,\w匹配的是[a-zA-Z0-9_],它本身已经包含了大小写字母,但如果你在模式中写了字面量字符,大小写是严格区分的。 - 能不能用正则表达式解析 HTML?
- 这是个著名的技术圈幽默问题。从计算机科学角度看,HTML 是一种上下文无关语言(Context-Free Grammar),而正则表达式只能处理正则语言(Regular Language),理论上正则无法完美解析任意 HTML。嵌套标签、属性中的特殊字符、注释中的标签等边界情况会让正则捉襟见肘。但对于一次性轻量任务——比如从一段已知格式的 HTML 片段中提取所有链接地址、简单清洗富文本编辑器的输出——正则仍然高效实用。如果需要处理复杂或不可预知的 HTML 文档,请使用专门的 HTML 解析库(如 Python 的 BeautifulSoup、JavaScript 的 cheerio 或 DOMParser)。
可以配合使用的工具
安全提示
正则表达式本身是纯文本模式匹配工具,不涉及网络请求或数据外传。你在本工具中输入的所有测试文本和正则表达式均在浏览器本地处理,不会被上传到任何服务器。但请特别注意以下安全实践:
- 避免在生产代码中直接执行用户提交的正则:攻击者可能提交恶意构造的正则表达式(如触发灾难性回溯的模式),导致服务器 CPU 资源耗尽。这被称为 ReDoS(Regular Expression Denial of Service)攻击。
- 自动化工作流中的正则:本站支持将正则测试工具串联到自定义工作流中,用于自动化的文本处理和格式转换。在工作流中使用正则时,务必在测试工具中充分验证模式在各类边界输入上的表现,避免匹配到预期之外的数据。
- 敏感数据脱敏:虽然在本地测试正则时数据是安全的,但如果你最终需要分享正则模式或测试结果给团队,请在截屏或复制之前先清除包含密码、API 密钥、手机号、身份证号等敏感信息的测试数据。
- 前端验证不能替代后端校验:正则表达式在浏览器端进行表单验证仅用于提升用户体验(即时反馈),不能作为安全防护手段。请在服务器端重新执行相同的校验逻辑。