目录

一、📚核心功能

二、⚔示例

1️⃣用户名验证

2️⃣密码验证

3️⃣手机号验证

4️⃣IP地址验证

5️⃣端口号验证

6️⃣邮箱验证

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


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

💓💓💓

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

一、📚核心功能

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

  1. 验证格式:检查文本是否符合预设规则,比如判断手机号、邮箱、身份证号是否合法。
  2. 提取内容:从大量文本中精准定位并提取目标信息,比如从日志里抓取所有 IP 地址,从文章里提取所有日期。
  3. 批量修改:按规则对文本进行统一替换,比如把文档中所有 “2024-xx-xx” 格式的日期改成 “2025-xx-xx”,或删除所有多余空格。

二、⚔示例

概念简单地说一下,接下来举几个例子:

1️⃣用户名验证
"^[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️⃣密码验证
"^(?=.*[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])

  • \\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️⃣端口号验证
"^(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️⃣邮箱验证
(\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、菜鸟工具)实时验证表达式效果,避免语法错误

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐