初始——正则表达式
目录
今天简单地用几个例子来讲一下正则表达式,确保能够看得懂。至于能不能写出来,因为毕竟现在AI工具挺多的,我觉得可以不用花费太多的精力在这上面,当然前提是能看得懂💓。
💓💓💓
正则表达式是一种用简洁语法描述文本模式的工具,核心用于匹配、提取和替换符合特定规则的文本,广泛应用于编程、数据处理和表单验证等场景。
一、📚核心功能
正则表达式的价值在于将复杂的文本规则 “代码化”,主要实现三大核心功能:
- 验证格式:检查文本是否符合预设规则,比如判断手机号、邮箱、身份证号是否合法。
- 提取内容:从大量文本中精准定位并提取目标信息,比如从日志里抓取所有 IP 地址,从文章里提取所有日期。
- 批量修改:按规则对文本进行统一替换,比如把文档中所有 “2024-xx-xx” 格式的日期改成 “2025-xx-xx”,或删除所有多余空格。
二、⚔示例
概念简单地说一下,接下来举几个例子:
1️⃣用户名验证
"^[a-zA-Z0-9_]{3,16}$"
逐字符解析:
^锚点:匹配字符串开头[a-zA-Z0-9_]字符类:
-
a-z小写字母 a 到 zA-Z大写字母 A 到 Z0-9数字 0 到 9_下划线
{3,16}量词:前面的字符类重复 3 到 16 次$锚点:匹配字符串结尾
匹配示例:
- ✅
user123(7个字符) - ✅
Admin_User(10个字符) - ✅
abc(3个字符,最小长度) - ❌
ab(太短) - ❌
user-name(包含-,不在允许字符内) - ❌
这是中文(包含非ASCII字符)
2️⃣密码验证
"^(?=.*[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️⃣手机号验证
"^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地址验证
"^((\\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️⃣端口号验证
"^(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️⃣邮箱验证
(\w+)(\.|_)?(\w*)@(\w+)(\.(\w+))+
逐字符解析:
- (\w+) 匹配邮箱用户名的第一部分:1 个及以上字母、数字或下划线(
\w等价于[a-zA-Z0-9_]) - (\.|_)? 匹配可选的连接符:
.或_,?表示这部分可有可无(0 次或 1 次) - (\w*) 匹配用户名的第二部分:0 个及以上字母、数字或下划线(补充连接符后的内容)
- @ 匹配邮箱中的
@符号(固定字符) - (\.(\w+))+ 匹配域名的后缀部分:
-
\.匹配.符号; -
(\w+)匹配后缀名(如com、cn、org); +表示后缀可多次出现(支持多级域名,如co.uk、com.cn)。
-
三、🔧正则表达式常用元字符总结
|
符号 |
含义 |
示例 |
|
|
字符串开头 |
|
|
|
字符串结尾 |
|
|
|
任意字符(除换行) |
|
|
|
0次或多次 |
|
|
|
1次或多次 |
|
|
|
0次或1次 |
|
|
|
恰好n次 |
|
|
|
至少n次 |
|
|
|
n到m次 |
|
|
|
字符类:a或b或c |
|
|
|
否定字符类:非a、b、c |
|
|
|
数字 [0-9] |
|
|
|
字母数字下划线 [a-zA-Z0-9_] |
|
|
|
空白字符 |
|
|
|
转义字符 |
|
|
|
正向前瞻 |
|
|
|
分组 |
|
❗注意:在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、菜鸟工具)实时验证表达式效果,避免语法错误
如有错误,欢迎各位读者大大指正💗💗💗
更多推荐


所有评论(0)