目录
今天简单地用几个例子来讲一下正则表达式,确保能够看得懂。至于能不能写出来,因为毕竟现在AI工具挺多的,我觉得可以不用花费太多的精力在这上面,当然前提是能看得懂💓。
💓💓💓
正则表达式是一种用简洁语法描述文本模式的工具,核心用于匹配、提取和替换符合特定规则的文本,广泛应用于编程、数据处理和表单验证等场景。
一、📚核心功能
正则表达式的价值在于将复杂的文本规则 "代码化",主要实现三大核心功能:
- 验证格式:检查文本是否符合预设规则,比如判断手机号、邮箱、身份证号是否合法。
- 提取内容:从大量文本中精准定位并提取目标信息,比如从日志里抓取所有 IP 地址,从文章里提取所有日期。
- 批量修改:按规则对文本进行统一替换,比如把文档中所有 "2024-xx-xx" 格式的日期改成 "2025-xx-xx",或删除所有多余空格。
二、⚔示例
概念简单地说一下,接下来举几个例子:
1️⃣用户名验证
cpp
"^[a-zA-Z0-9_]{3,16}$"
逐字符解析:
^锚点:匹配字符串开头[a-zA-Z0-9_]字符类:
-
a-z小写字母 a 到 z- **
A-Z**大写字母 A 到 Z 0-9数字 0 到 9_下划线
{3,16}量词:前面的字符类重复 3 到 16 次$锚点:匹配字符串结尾
匹配示例:
- ✅
user123(7个字符) - ✅
Admin_User(10个字符) - ✅
abc(3个字符,最小长度) - ❌
ab(太短) - ❌
user-name(包含-,不在允许字符内) - ❌
这是中文(包含非ASCII字符)
2️⃣密码验证
cpp
"^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[@$%!*?&])[A-Za-z\\d@$%!*?&]{4,20}$"
逐部分解析:
前置断言部分(零宽度断言,不消耗字符):
(?=.*[A-Z])正向前瞻断言:
-
(?=...)前瞻断言语法.*任意字符(除换行符)0次或多次[A-Z]至少包含一个大写字母
(?=.*[a-z])至少包含一个小写字母(?=.*\\d)至少包含一个数字
-
\\d在C++字符串中表示\d(数字)
- (?=.[@$%!?&]) 至少包含一个特殊字符
-
@$%!*?&允许的特殊字符列表
实际匹配部分:
[A-Za-z\\d@$%!*?&]{4,20}实际字符集合,长度4到20
-
- 只允许:大小写字母、数字、特殊字符
匹配示例:
- ✅
Abc1@(5个字符,包含大写、小写、数字、特殊字符) - ✅
MyP@ssw0rd(10个字符) - ❌
abc123@(缺少大写字母) - ❌
ABC123@(缺少小写字母) - ❌
Abcdefg@(缺少数字) - ❌
Abc123(缺少特殊字符)
3️⃣手机号验证
cpp
"^1[3456789]\\d{9}$"
逐字符解析:
^字符串开头1字面量字符1(中国手机号都以1开头)[3456789]字符类:第二位是 3、4、5、6、7、8、9 中的一个
-
- 对应运营商号段:13x, 14x, 15x, 16x, 17x, 18x, 19x
- \d{9
}数字重复9次(剩余9位) $字符串结尾
总长度:1 + 1 + 9 = 11位
匹配示例:
- ✅
13812345678 - ✅
18900001234 - ❌
12812345678(第二位是2,不在允许范围内) - ❌
138123456789(12位,太长) - ❌
1381234567(10位,太短)
4️⃣IP地址验证
cpp
"^((\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])$"
结构分解 :
这是一个验证 IPv4 地址的正则,格式为**xxx.xxx.xxx.xxx**
每段数字验证 :(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])
\\d0-9(单个数字,0-9)[1-9]\\d10-99(两位数,10-99)1\\d{2}100-199(1开头的三位数)2[0-4]\\d200-249(2开头,第二位0-4)25[0-5]250-255(最大值)
完整结构:
((每段验证)\\.){3}前三段(每段后面有点号.)(每段验证)最后一段(没有点号)
匹配示例:
- ✅
192.168.1.1 - ✅
255.255.255.255 - ✅
0.0.0.0 - ❌
256.1.1.1(256超出范围) - ❌
192.168.1(缺少一段) - ❌
192.168.1.1.1(多了一段)
5️⃣端口号验证
cpp
"^(0|([1-9]\\d{0,3})|([1-5]\\d{4})|(6[0-4]\\d{3})|(65[0-4]\\d{2})|(655[0-2]\\d)|(6553[0-5]))$"
目标:验证 0-65535 的端口号
分段解析:
0端口0[1-9]\\d{0,3}1-9999
-
[1-9]首位1-9\\d{0,3}后面0到3个数字
[1-5]\\d{4}10000-59999
-
[1-5]首位1-5\\d{4}后面4个数字
6[0-4]\\d{3}60000-64999
-
6首位6[0-4]第二位0-4\\d{3}后面3个数字
65[0-4]\\d{2}65000-65499
-
65前两位65[0-4]第三位0-4\\d{2}后面2个数字
655[0-2]\\d65500-65529
-
655前三位655[0-2]第四位0-2\\d最后1个数字
6553[0-5]65530-65535
-
6553前四位6553[0-5]最后一位0-5
匹配示例:
- ✅
0(特殊端口) - ✅
80(HTTP) - ✅
8080(常用端口) - ✅
65535(最大端口) - ❌
65536(超出范围) - ❌
-1(负数)
6️⃣邮箱验证
cpp
(\w+)(\.|_)?(\w*)@(\w+)(\.(\w+))+
逐字符解析:
- (\w+) 匹配邮箱用户名的第一部分:1 个及以上字母、数字或下划线(
\w等价于[a-zA-Z0-9_]) - (\.|_)? 匹配可选的连接符:
.或_,?表示这部分可有可无(0 次或 1 次) - (\w*) 匹配用户名的第二部分:0 个及以上字母、数字或下划线(补充连接符后的内容)
- @ 匹配邮箱中的
@符号(固定字符) - (\.(\w+))+ 匹配域名的后缀部分:
\.匹配.符号;(\w+)匹配后缀名(如com、cn、org);+表示后缀可多次出现(支持多级域名,如co.uk、com.cn)。
三、🔧正则表达式常用元字符总结
|-----------|------------------------|-----------------------------|
| 符号 | 含义 | 示例 |
| ^ | 字符串开头 | ^abc 匹配以abc开头 |
| $ | 字符串结尾 | abc$ 匹配以abc结尾 |
| . | 任意字符(除换行) | a.c 匹配 abc, a1c |
| * | 0次或多次 | ab* 匹配 a, ab, abb |
| + | 1次或多次 | ab+ 匹配 ab, abb (不匹配a) |
| ? | 0次或1次 | ab? 匹配 a, ab |
| {n} | 恰好n次 | a{3} 匹配 aaa |
| {n,} | 至少n次 | a{2,} 匹配 aa, aaa, aaaa... |
| {n,m} | n到m次 | a{2,4} 匹配 aa, aaa, aaaa |
| [abc] | 字符类:a或b或c | [abc] 匹配 a, b, c |
| [^abc] | 否定字符类:非a、b、c | [^abc] 匹配除a,b,c外的字符 |
| \d | 数字 [0-9] | \d{3} 匹配3位数字 |
| \w | 字母数字下划线 [a-zA-Z0-9_] | \w+ 匹配单词 |
| \s | 空白字符 | \s+ 匹配空格、tab |
| \ | 转义字符 | \. 匹配字面量点号 |
| (?=...) | 正向前瞻 | a(?=b) 匹配后面是b的a |
| (abc) | 分组 | (ab)+ 匹配 ab, abab |
❗注意 :在C++字符串中,反斜杠需要双写:\d、\s、\.
在正则表达式中,\d 是一个特殊的元字符,用于匹配任意一个数字(0-9),等价于 [0-9]。
而你看到的 \\d 是在编程语言中使用正则表达式时的写法,这是因为在很多编程语言(如 Java、Python、JavaScript 等)中,字符串中的反斜杠 **\**本身是一个转义字符,需要用另一个反斜杠来转义它,才能表示一个实际的反斜杠。
例如:
- 在正则表达式语法中,我们写**
\d**表示匹配数字 - 但在 Java 代码的字符串中,要表示这个正则,就需要写成
"\d"(第一个**\** 用于转义第二个\,最终正则引擎会解析为**\d**)
所以 ^1[3456789]\\d{9}$ 其实等价于正则表达式语法中的 ^1[3456789]\d{9}$,表示:
- 以
1开头 - 第二位是
3/4/5/6/7/8/9中的任意一个 - 后面跟 9 位数字
- 整体刚好 11 位,符合手机号格式
简单说,\d 是编程语言中对正则表达式 \d 的转义写法,本质功能还是匹配数字。
因为只是举了几个例子来展示了正则表达式的用法,如果读者有需要的话,可以使用在线正则测试工具(如 Regex101、菜鸟工具)实时验证表达式效果,避免语法错误
如有错误,欢迎各位读者大大指正💗💗💗