初始——正则表达式

目录

一、📚核心功能

二、⚔示例

1️⃣用户名验证

2️⃣密码验证

3️⃣手机号验证

4️⃣IP地址验证

5️⃣端口号验证

6️⃣邮箱验证

三、🔧正则表达式常用元字符总结


今天简单地用几个例子来讲一下正则表达式,确保能够看得懂。至于能不能写出来,因为毕竟现在AI工具挺多的,我觉得可以不用花费太多的精力在这上面,当然前提是能看得懂💓。

💓💓💓

正则表达式是一种用简洁语法描述文本模式的工具,核心用于匹配、提取和替换符合特定规则的文本,广泛应用于编程、数据处理和表单验证等场景。

一、📚核心功能

正则表达式的价值在于将复杂的文本规则 "代码化",主要实现三大核心功能:

  1. 验证格式:检查文本是否符合预设规则,比如判断手机号、邮箱、身份证号是否合法。
  2. 提取内容:从大量文本中精准定位并提取目标信息,比如从日志里抓取所有 IP 地址,从文章里提取所有日期。
  3. 批量修改:按规则对文本进行统一替换,比如把文档中所有 "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])

  • \\d 0-9(单个数字,0-9)
  • [1-9]\\d 10-99(两位数,10-99)
  • 1\\d{2} 100-199(1开头的三位数)
  • 2[0-4]\\d 200-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]\\d 65500-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+) 匹配后缀名(如 comcnorg);
    • + 表示后缀可多次出现(支持多级域名,如 co.ukcom.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、菜鸟工具)实时验证表达式效果,避免语法错误

如有错误,欢迎各位读者大大指正💗💗💗

相关推荐
Peterrrr09112 小时前
深入理解 Shell 编程:正则表达式与 sed 文本处理器
linux·运维·正则表达式·sed·linux命令
likuolei2 小时前
正则表达式 - 元字符
数据库·mysql·正则表达式
阿赵3D2 小时前
JavaScript学习笔记——11、正则表达式
javascript·笔记·学习·正则表达式
一叶飘零_sweeeet2 小时前
正则表达式从入门到精通:吃透底层逻辑,解决99%的实际问题
正则表达式
沧澜sincerely2 小时前
蓝桥杯101 拉马车
c++·蓝桥杯·stl
w-w0w-w2 小时前
运算符重载
c++
持梦远方3 小时前
持梦行文本编辑器(cmyfEdit):架构设计与十大核心功能实现详解
开发语言·数据结构·c++·算法·microsoft·visual studio
小灰灰搞电子3 小时前
C++ 文件操作详解
开发语言·c++·文件操作
im_AMBER3 小时前
Leetcode 90 最佳观光组合
数据结构·c++·笔记·学习·算法·leetcode