每个开发者都应该掌握的正则表达式模式
正则表达式(regex)是开发者工具箱中最强大的工具之一。它们允许你用简洁的模式来搜索、验证和转换文本,而这些操作如果用过程式代码可能需要数十行。虽然正则表达式语法乍看之下可能晦涩难懂,但掌握一组核心模式就能覆盖绝大多数实际用例。本指南介绍了你将反复使用的正则表达式模式,并详细解释每个模式的工作原理。
正则表达式基础回顾
在深入具体模式之前,这里快速回顾一下构成所有正则表达式模式基础元字符:
| 元字符 | 含义 | 示例 |
|---|---|---|
| . | 任意单个字符 | a.c 匹配 abc、a1c、a c |
| * | 前一个字符零次或多次 | ab*c 匹配 ac、abc、abbc |
| + | 前一个字符一次或多次 | ab+c 匹配 abc、abbc |
| ? | 前一个字符零次或一次 | colou?r 匹配 color、colour |
| ^ | 字符串开头 | ^Hello 匹配开头的 Hello |
| $ | 字符串结尾 | world$ 匹配结尾的 world |
| [] | 字符类 | [aeiou] 匹配任意元音字母 |
| () | 捕获组 | (ab)+ 匹配 ab、abab |
| | | 交替(或) | cat|dog 匹配 cat 或 dog |
| \d | 数字 [0-9] | \d{3} 匹配 123 |
| \w | 单词字符 [a-zA-Z0-9_] | \w+ 匹配 hello_123 |
| \s | 空白字符 | a\sb 匹配 a b |
1. 邮箱验证
基本邮箱模式
此模式验证邮箱地址的基本结构:@ 前有一个或多个允许的字符,后跟至少包含一个点号的域名,以及两个或更多字母的顶级域名。它能捕获大多数无效格式,同时允许合法地址通过。
匹配:user@example.com、john.doe+tag@company.co.uk
不匹配:user@、@example.com、user@.com
2. URL 验证
HTTP/HTTPS URL 模式
此模式匹配带有可选 www 前缀的 HTTP 和 HTTPS URL,包含域名和可选路径。s? 使 https 中的 "s" 变为可选,(www\.)? 使 www 前缀变为可选。路径段 (\/[^\s]*)? 允许域名后出现除空白字符外的任何字符。
匹配:https://example.com、http://www.example.com/path/to/page
不匹配:ftp://example.com、example.com(无协议)
3. 电话号码验证
国际电话号码
此模式遵循 E.164 国际电话号码格式。它允许可选的 + 前缀,要求第一位数字为 1-9(无前导零),总共最多允许 15 位数字。这是国际上存储和验证电话号码最可靠的格式。
匹配:+14155552671、442071838750
不匹配:+01xxxxxxxxx、123
4. 密码强度
强密码模式
此模式强制执行强密码策略:至少 8 个字符,包含至少一个小写字母、一个大写字母、一个数字和一个特殊字符。(?=.*[...]) 语法使用正向前瞻来检查每种字符类型的存在,而不消耗字符。
匹配:MyP@ss1word、Str0ng!Pass
不匹配:password、Password1、P@ss
5. IP 地址验证
IPv4 地址
此模式验证 IPv4 地址并进行正确的范围检查。每个八位组必须在 0 到 255 之间。该模式使用交替匹配:250-255(25[0-5])、200-249(2[0-4]\d)或 0-199([01]?\d\d?)。这在三个点号后重复三次,然后最后一次用于最终的八位组。
匹配:192.168.1.1、10.0.0.1、255.255.255.0
不匹配:256.1.1.1、192.168.1、192.168.1.1.1
6. 日期格式验证
YYYY-MM-DD (ISO 8601)
此模式验证 ISO 8601 格式(YYYY-MM-DD)的日期。它检查四位数的年份、01-12 之间的月份和 01-31 之间的日期。请注意,此模式验证格式但不验证日期的逻辑有效性(例如,它允许 2026-02-31)。要进行完整验证,请解析日期并以编程方式检查。
匹配:2026-05-20、2025-01-01、2024-12-31
不匹配:2026-5-20、2026-13-01、26-05-20
7. 十六进制颜色代码
CSS 十六进制颜色
此模式匹配 CSS 十六进制颜色代码,包括 3 位简写(#fff)和 6 位完整形式(#ffffff)。{1,2} 量词允许 3 位十六进制数字组的 1 次或 2 次重复,同时支持两种格式。
匹配:#fff、#FF5733、#1e293b
不匹配:fff、#ff、#1234567
8. Slug / URL 安全字符串
URL Slug 模式
此模式验证 URL slug:以连字符为分隔符的小写字母数字字符串。它确保没有前导或尾随连字符,也没有连续连字符。这种格式对 SEO 友好,可安全用于 URL、文件名和标识符。
匹配:my-blog-post、regex-patterns-guide、tool123
不匹配:My-Post、-slug、slug-、my--post
9. 信用卡号
通用信用卡模式
此模式验证主要信用卡号:Visa(以 4 开头,13 或 16 位)、Mastercard(以 51-55 开头,16 位)、American Express(以 34 或 37 开头,15 位)和 Discover(以 6011 或 65 开头,16 位)。将此与 Luhn 算法结合使用以完成完整验证。
10. HTML 标签匹配
HTML 标签提取
此模式匹配带有内容的开闭 HTML 标签。第一个捕获组 ([a-z][a-z0-9]*) 捕获标签名,反向引用 \1 确保闭标签与开标签匹配。(.*?) 使用懒惰匹配捕获标签之间的内容,以获得最短匹配。
编写更好正则表达式的技巧
- 从简单开始:先编写最基本的模式版本,然后逐步增加复杂性。每一步都进行测试。
- 使用字符类:[a-z] 比 (a|b|c|...|z) 更清晰。命名类如 \d、\w 和 \s 可提高可读性。
- 优先使用懒惰量词:当你需要最短匹配时,使用 *? 和 +? 代替 * 和 +,以避免贪婪过度匹配。
- 使用锚点:验证模式始终使用 ^ 和 $,确保整个字符串匹配,而不仅仅是子字符串。
- 避免灾难性回溯:嵌套量词如 (a+)+ 可能导致某些输入的指数级时间复杂度。在可用时使用原子组或占有量词。
- 注释复杂模式:使用 x 标志(详细模式)为复杂模式添加空格和注释。
想要交互式测试这些正则表达式模式?试试我们免费的正则表达式测试工具,支持实时匹配、捕获组可视化和模式解释。
测试正则表达式常见问题
什么是正则表达式模式?
正则表达式模式是定义搜索模式的字符序列。它用于字符串匹配、验证、搜索替换操作和文本解析。正则表达式模式使用 .、*、+、?、[]、() 和 {} 等特殊元字符来定义灵活的匹配规则。
我应该用正则表达式验证邮箱吗?
使用正则表达式进行基本的邮箱格式验证(检查 @ 符号、域名结构),但不要试图仅用正则表达式完全验证邮箱地址。邮箱规范(RFC 5322)极其复杂,没有正则表达式能完美验证所有有效地址。在生产环境中,应将基本正则验证与实际邮箱验证(发送确认链接)结合使用。
贪婪量词和懒惰量词有什么区别?
贪婪量词(*、+)尽可能多地匹配文本,而懒惰量词(*?、+?)尽可能少地匹配文本。例如,应用于 'aabb' 时,贪婪模式 a.*b 匹配 'aabb'(整个字符串),而懒惰模式 a.*?b 仅匹配 'aab'(最短匹配)。
如何测试正则表达式模式?
使用在线正则表达式测试工具(如 ToolHub 正则表达式测试器)交互式地测试模式。这些工具实时高亮匹配结果,显示捕获组,并解释模式各部分的功能。
不同编程语言的正则表达式是否相同?
大多数正则表达式语法在语言间是共享的,但高级特性存在差异。JavaScript 在旧版引擎中不支持回顾断言,Python 使用与 JavaScript 不同的命名组语法,PCRE(PHP)比大多数其他引擎支持更多特性。务必在目标语言中测试模式。