正则表达式实战指南:原理、口诀与高频场景案例
正则表达式实战指南:原理、口诀与高频场景案例
正则表达式(Regular Expression)是程序员处理文本的瑞士军刀,被广泛应用于数据验证、日志分析、爬虫开发等领域。本文将从原理讲解、口诀速查到高频实战案例,带你系统掌握正则表达式的核心知识与实用技巧。
一、原理简述:正则表达式的本质
正则表达式是一种用特定符号(元字符)描述字符串匹配规则的“公式”。本质上,它是用简洁的符号组合,描述哪些字符串是你要的。
- 每个元字符代表一种规则或条件,如“数字”、“字母”、“开头结尾”等。
- 通过组合元字符,可以拼出复杂的筛选条件。
- 正则表达式引擎会逐字符扫描目标文本,按规则查找或验证。
转义符 \ 的作用:
遇到如 .
、*
等特殊含义的元字符,需用 \
进行转义,如 \.
匹配真实的小数点,\\
匹配反斜杠本身。
二、元字符速查表与记忆口诀
常用元字符及口诀
元字符 | 含义 | 口诀 | 示例 |
---|---|---|---|
. | 任意单字符(除换行) | 小点能代啥都行 | a.b 匹配 a1b |
* | 前项0次或多次 | 星号零多随你挑 | ab* 匹配 a、ab、abb |
+ | 前项1次或多次 | 加号一多不能少 | ab+ 匹配 ab、abb |
? | 前项0次或1次 | 问号可有可无 | ab? 匹配 a、ab |
[] | 括号内任一字符 | 方括任选一个 | [abc] 匹配 a,b,c |
{n} | 前项精确n次 | 花括定次数 | \d{3} 匹配 123 |
{n,m} | 前项n到m次 | 量词范围花括定 | \d{2,4} 匹配12、1234 |
\d | 一位数字 | d是digit数字 | \d\d 匹配 12 |
\w | 字母/数字/下划线 | w是word单词成员 | \w\w 匹配 a1 |
\s | 空白符(空格/制表/换行) | s是space空白符 | \s+ 匹配空格 |
^ | 字符串开头 | 脱字符锁开头 | ^abc 匹配abc开头 |
$ | 字符串结尾 | 美元符定结尾 | abc$ 匹配abc结尾 |
() | 分组/整体应用 | 小括号成团结队 | (ab)+ 匹配 abab |
| | 或者分支 | 竖线二选一 | a|b 匹配a或b |
[^abc] | 非括号内任意字符 | 方括脱字符排除 | [^a] 匹配非a字符 |
口诀记忆法
- 点星加问方,花括次数量。
- 转义反斜杠,符号真实样。
- 脱字符开头,美元符结尾,方括内排除,分组小括忙。
- 竖线是或,\d数字,\w词,\s空。
当然可以!下面是对正则表达式相关口诀的详细解释说明,帮助你理解每句口诀背后的含义和用法。
正则表达式口诀解释说明
1. 点星加问方,花括次数量。
- 点(.):匹配任意一个字符(除了换行符)。
例:a.b
能匹配acb
、a1b
、a-b
等。 - 星号(*):表示前面的内容出现0次或多次。
例:ab*
能匹配a
、ab
、abb
、abbb
等。 - 加号(+):表示前面的内容出现1次或多次。
例:ab+
能匹配ab
、abb
,但不匹配a
。 - 问号(?):前面的内容出现0次或1次。
例:ab?
能匹配a
或ab
。 - 方括号([]):括号内任意一个字符都能匹配。
例:[abc]
匹配a
、b
或c
。 - 花括号({n}、{n,m}):指定前面内容出现的次数或范围。
例:\d{3}
匹配3位数字,\d{2,4}
匹配2到4位数字。
口诀含义:这一句总结了正则表达式最常用的匹配次数和内容描述符号,写正则时灵活组合,可以覆盖大多数基础场景。
2. 转义反斜杠,符号真实样。
- 反斜杠(\):用于转义,让特殊符号变成普通字符,或者让普通字符有特殊含义。
例:\.
匹配“.”本身,而不是“任意字符”;\d
匹配数字;\\
匹配反斜杠本身。 - 符号真实样:如果你要匹配的就是一个特殊符号(如点、星号、加号等),一定要加反斜杠“逃逸”一下,才能按字面意义识别。
口诀含义:提醒你遇到特殊符号要注意用反斜杠转义,否则表达的意思就会变。
3. 脱字符开头,美元符结尾,方括内排除,分组小括忙。
- 脱字符(^):在正则最前面表示“字符串开头”。
例:^abc
匹配以abc
开头的字符串。 - 美元符($):在正则最后面表示“字符串结尾”。
例:abc$
匹配以abc
结尾的字符串。 - 方括号内^([^…]):在方括号第一个位置表示“排除”,匹配不在括号内的字符。
例:[^a]
匹配任何非a
的字符。 - 小括号(()):用于分组,一是整体应用量词,二是捕获分组内容,方便后续引用。
例:(ab)+
匹配ab
、abab
;\1
可以引用第一个分组的内容。
口诀含义:总结了正则中“定位”、“排除”和“分组”相关的用法,是写复杂表达式时的核心工具。
4. 竖线是或,\d数字,\w词,\s空。
- 竖线(|):表示“或者”分支,可以实现多选。
例:cat|dog
匹配cat
或dog
。 - \d:匹配一位数字(0-9),等价于
[0-9]
。 - \w:匹配字母、数字、下划线,等价于
[A-Za-z0-9_]
。 - \s:匹配空白字符,包括空格、制表符、换行等。
口诀含义:把常用的“或分支”和“快捷字符集”记下来,写正则更高效。
四、高频场景案例与解析
1. 手机号精准匹配(中国)
^1[3-9]\d{9}$
^1
:以1开头;[3-9]
:第二位为3-9;\d{9}
:后九位数字;$
:结尾。
场景:注册、绑定手机
2. 邮箱格式验证(支持多级域名)
^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$
- 用户名可含字母、数字、下划线、点、短横线
- 支持多级域名
- 顶级域名2-6位字母
场景:注册、邮件校验
3. 强密码校验(8-20位,含数字、大小写字母、特殊符号)
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*]).{8,20}$
- 多个正向预查,分别要求至少出现1个数字、小写、大写、特殊符号
场景:注册、改密
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~255
场景:网络、日志
5. 中文姓名(含“·”间隔符)
^[\u4e00-\u9fa5]{2,8}(·[\u4e00-\u9fa5]{1,8})?$
- 支持少数民族姓名的“·”分隔
场景:实名认证、表单校验
6. 日期格式(YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
- 年月日格式,简单合法性校验
场景:数据录入、表单校验
7. 提取HTML标签内容(非贪婪)
<([a-z][a-z0-9]*)\b[^>]*>(.*?)</\1>
- 捕获标签名与内容,非贪婪避免跨标签
场景:网页爬虫、文本提取
8. 删除多余空格
\s{2,}
- 匹配2个及以上空白字符,替换为单个空格
场景:文本清洗
9. 匹配十六进制颜色值
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
- 支持#FFF和#FFFFFF
场景:前端开发、样式校验
10. 匹配信用卡号(16位数字,4位分隔)
^\d{4}(-\d{4}){3}$
- 或纯数字版:
^\d{16}$
场景:支付、金融
11. 匹配连续重复单词
\b(\w+)\b\s+\1\b
- 检查如 “is is”、“the the”
场景:拼写检查
12. 提取URL中的域名
^(?:https?://)?([^/?#]+)
- 提取主域名部分
场景:日志、SEO
四、实用细节与优化建议
- 贪婪与非贪婪:
.*
默认贪婪,.*?
非贪婪,提取内容时优先用非贪婪。 - 特殊字符位置:如
^
在[]内表示取反,在外表示开头。 - 性能问题:避免嵌套量词(如
(a+)+
),防止回溯爆炸;复杂需求建议分步处理。 - 调试工具:推荐 regex101.com、RegExr Debuggex(可视化正则引擎流程)
五、总结与建议
- 本质:正则=用特殊符号组合描述字符串“筛选条件”
- 口诀:点星加问方,组合灵活用;脱字符开头,美金符结尾;斜杠d是数字,斜杠w是字母;竖线是或者,分支随你挑。
- 实战:速查元字符表+高频案例,遇到复杂需求先用自然语言描述,再逐步拆解为正则。
收藏本博客,查找正则表达式再也不犯难!如需定制场景,欢迎留言交流。