正则表达式是编程界的“文本处理瑞士军刀”,无论是表单验证、日志分析还是数据提取,都能凭借简洁的语法实现高效匹配。本文结合18个经典例题,从基础符号到复杂场景,带你循序渐进掌握正则核心逻辑,看完就能直接上手实操。
一、正则表达式基础:核心符号与入门思维
正则的核心是“用符号描述字符规律”,掌握几个基础符号就能解决80%的简单场景。首先明确两个关键原则:
-
正则匹配默认“部分匹配”,需用
^(开头)和$(结尾)实现“完全匹配” -
特殊符号(如
.*|)需用\转义才能匹配字面意义 -
推荐工具:在线正则测试工具(tool.oschina.net/regex/),实时验证匹配效果
核心基础符号速记
-
^:字符串开头(中括号内首位置表示“取反”,如[^a-z]) -
$:字符串结尾 -
.:匹配任意单个字符(除换行符\n) -
[]:字符集,匹配括号内任意一个字符(如[0-9]匹配单个数字) -
?:前面单元重复0-1次(可有可无) -
+:前面单元重复1-n次(至少一次) -
*:前面单元重复0-n次(任意次数) -
{n}:前面单元精确重复n次;{m,n}:重复m到n次
记忆口诀:“问号可有可无,加号必须有,星号随便有”,记准这一句就能避开大部分基础误区。
二、经典例题实战:从简单到复杂逐步突破
1. 匹配以S开头的字符串
需求:仅匹配大写S开头的完整字符串,忽略其他开头的内容。
-
正则表达式:
^S.*$ -
原理拆解:
^S锁定开头为大写S,.*匹配后续任意字符(除换行),$锁定结尾 -
验证结果:"S开头字符串"匹配成功,"AS"(非开头S)、"s小写开头"(大小写敏感)匹配失败
-
注意:正则默认区分大小写,若需忽略大小写可添加修饰符(如Python中
re.IGNORECASE)
2. 匹配以数字结尾的字符串
需求:字符串最后一位为0-9的任意数字。
-
正则表达式:
[0-9]$或\d$(两者等价) -
数字表示技巧:枚举法
[0123456789]、区间法[0-9]、预定义类\d(Perl正则扩展语法) -
验证示例:"asdf1"匹配成功,"asdf"(无数字结尾)、"asdfa"(字母结尾)匹配失败
3. 匹配空字符串
需求:仅匹配长度为0的空字符串。
-
正则表达式:
^$ -
原理:
^和$直接衔接,中间无任何字符,代表“从开头到结尾无内容” -
实操注意:部分在线工具要求输入内容才能测试,实际编程中可结合“字符串长度判断+正则匹配”双重验证
4. 匹配仅包含三个数字的字符串
需求:字符串长度固定为3,且全为数字,多一位少一位都不匹配。
-
正则表达式:
^[0-9]{3}$或^\d{3}$ -
关键逻辑:
{3}表示前面的数字单元精确重复3次,^和$确保完全匹配(避免匹配"1234"中的"123"片段) -
验证结果:"123"匹配成功,"12"(长度不足)、"1234"(长度超额)、"12a"(含非数字)匹配失败
5. 匹配3-5个字母的字符串
需求:字符串由大小写字母组成,长度在3到5之间。
-
正则表达式:
^[a-zA-Z]{3,5}$ -
字母表示技巧:
[a-zA-Z]匹配所有大小写字母,区间之间不可加空格 -
重复控制:
{3,5}表示最少3次、最多5次重复 -
验证示例:"abc"(3位)、"ABCD"(4位)匹配成功,"ab"(2位)、"abcdef"(6位)匹配失败
6. 匹配非小写字母的任意字符
需求:仅匹配单个字符,且该字符不是a-z的小写字母。
-
正则表达式:
[^a-z] -
取反规则:
^必须放在中括号内第一个位置才表示“取反”,若在括号外则表示“开头” -
匹配范围:大写字母(A)、数字(1)、符号(_)、空格等均可匹配,小写字母(a)不匹配
-
注意:仅能匹配单个字符,若需匹配多个非小写字母字符,需加重复限定符(如
[^a-z]+)
7. 匹配0到1个数字/字母/下划线
需求:字符串为空,或仅包含一个“单词字符”(数字、大小写字母、下划线)。
-
正则表达式:
^\w?$ -
预定义类:
\w等价于[0-9a-zA-Z_],是正则中常用的“单词字符”缩写 -
数量控制:
?表示前面的\w重复0-1次 -
验证结果:空字符串、"1"、"a"、"_"匹配成功,"ab"、"12"(多个字符)匹配失败
8. 匹配1个或多个空白符号
需求:匹配制表符(\t)、空格、换行符(\n)、回车符(\r)等空白字符,且至少出现一次。
-
正则表达式:
^\s+$ -
预定义类:
\s等价于[\t\n\r\f],涵盖所有常见空白字符 -
重复控制:
+表示至少出现1次,避免匹配空字符串 -
应用场景:清理文本中的多余空白、验证输入是否全为空格
9. 匹配任意长度字符串(含空字符串)
需求:匹配空字符串或任意长度的非换行字符。
-
正则表达式:
^.*$ -
核心组合:
.匹配任意单个字符(除\n),*表示0-n次重复 -
限制说明:无法匹配换行符,若需匹配包含换行符的文本,需启用“多行模式”(如Python中
re.DOTALL)
10. 匹配零或任意多组ABC
需求:字符串由ABC重复组成,可空、可重复1次或多次。
-
正则表达式:
^(ABC)*$ -
分组技巧:用
(ABC)将多个字符组合为一个“匹配单元”,*作用于整个单元 -
验证结果:空字符串(0次)、"ABC"(1次)、"ABCABC"(2次)匹配成功,"AB"(不完整单元)、"ABC123"(含其他字符)匹配失败
-
对比:若用
^ABC*$(无括号),则表示“AB + 任意个C”,会匹配"AB"、"ABC"、"ABCC"等,需注意分组的重要性
11. 匹配要么是ABC,要么是123的字符串
需求:字符串必须完全是ABC或123,不能是包含这两个子串的其他内容。
-
正则表达式:
^(ABC|123)$ -
选择符规则:
|表示“或”逻辑,需用括号()限定选择范围,否则^ABC|123$会匹配“ABC开头”或“123结尾”的字符串(如"ABC123"、"X123") -
验证示例:"ABC"、"123"匹配成功,"ABC123"、"AB"、"12"匹配失败
12. 匹配单个点号(.)
需求:仅匹配字符串为单个点号,避免点号被当作“任意字符”解析。
-
正则表达式:
^\.$ -
转义逻辑:
.在正则中是特殊字符,需用\转义为\.,才能匹配字面意义的点号 -
验证结果:"."匹配成功,".."(多个点号)、"a"(其他字符)匹配失败
13. 匹配100-999的三位整数
需求:仅匹配100到999的十进制整数,不包含以0开头的数字(如010)。
-
正则表达式:
^[1-9][0-9]{2}$ -
分段设计:第一位
[1-9](1-9,避免前导零),后两位[0-9]{2}(0-9重复2次) -
关键:
^和$必须存在,否则会匹配“1234”中的“123”片段
14. 匹配0-999的整数
需求:涵盖0、1-99、100-999,排除前导零(如010)和超出范围的数字(如1000)。
-
正则表达式:
^([0-9]|[1-9][0-9]|[1-9][0-9]{2})$(简化版:^([0-9]|[1-9][0-9]{1,2})$) -
分段逻辑:一位数
[0-9]、两位数[1-9][0-9]、三位数[1-9][0-9]{2},用|组合 -
验证示例:0、9、10、99、100、999匹配成功,010、1000匹配失败
15. 匹配合法IP地址(0.0.0.0-255.255.255.255)
需求:IP地址由4个段组成,每个段为0-255的整数,段之间用点号分隔。
-
单个段正则(0-255):
([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])-
一位数:
[0-9](0-9) -
两位数:
[1-9][0-9](10-99) -
三位数:100-199(
1[0-9]{2})、200-249(2[0-4][0-9])、250-255(25[0-5])
-
-
完整IP正则:
^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ -
关键:段之间的点号需转义为
\.,避免被解析为“任意字符”
16. 匹配合法端口号(0-65535)
需求:端口号范围为0-65535,需覆盖不同位数的数值分段。
-
匹配思路:参考IP地址分段逻辑,按位数和数值范围拆分
-
0-9:
[0-9] -
10-99:
[1-9][0-9] -
100-999:
[1-9][0-9]{2} -
1000-9999:
[1-9][0-9]{3} -
10000-65535:
[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]
-
-
完整正则:
^([0-9]|[1-9][0-9]|[1-9][0-9]{2}|[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ -
应用场景:网络编程中验证端口输入合法性
三、正则表达式分类与工具使用
1. 三大正则类型对比
|
类型 |
核心特点 |
适用场景 |
|
基础正则 |
元字符(+、?、*)视为普通字符,功能简单 |
早期工具(如grep基础模式) |
|
扩展正则 |
元字符视为特殊字符,支持复杂匹配 |
egrep、sed -E、awk |
|
Perl正则 |
支持 |
Python、JavaScript、PHP等编程语言 |
目前主流编程语言和工具均采用Perl正则规范,学习时优先掌握该类型的语法。
2. 实用工具推荐
-
在线测试:tool.oschina.net/regex/(或www.jyshare.com/front-end/854/)
-
编程调试:
-
Python:
re模块(re.match完全匹配、re.search部分匹配、re.findall提取所有匹配项) -
Shell:grep(基础正则)、egrep(扩展正则)、sed/awk(文本处理)
-
-
调试技巧:bash脚本中用
set -x开启调试模式,查看正则执行过程
四、实战避坑与高效技巧
-
区分“部分匹配”与“完全匹配”:无
^和$时,正则会匹配字符串中任意符合规则的子串,如需匹配整个字符串,务必添加边界符。 -
特殊字符转义:
.*+?|()[]^$等特殊字符,需用\转义才能匹配字面意义。 -
预定义类优先用:
\d(数字)、\w(单词字符)、\s(空白字符)比手动写[0-9][a-zA-Z_]更简洁,且兼容性更好。 -
复杂场景分段写:如IP、端口号等多规则场景,先拆分单个单元的正则,再组合整体,降低出错概率。
-
避免过度依赖正则:数值范围判断(如1-1000),先用正则匹配格式,再用代码转换为数值验证范围,比纯正则更简洁可靠。
五、常用正则表达式速查表(直接复制使用)
-
中文匹配:
^[\u4e00-\u9fa5]+$(匹配纯中文) -
Email地址:
^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$ -
网址URL:
^https?://[^\s]+$(匹配http/https协议的网址) -
手机号(国内):
^1[3-9][0-9]{9}$ -
身份证(18位):
^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$ -
邮政编码(6位):
^[1-9][0-9]{5}$
总结
正则表达式的核心是“用符号描述规律”,学习时无需死记硬背,先掌握^ $ . [] * + ?等基础符号,再通过经典例题拆解逻辑,最后结合实际场景练习,就能逐步熟练。记住:好的正则不仅要能匹配需求,还要具备可读性和可维护性,复杂场景记得分段设计、多加注释。
1159

被折叠的 条评论
为什么被折叠?



