从入门到实战:18个经典例题吃透正则表达式

正则表达式是编程界的“文本处理瑞士军刀”,无论是表单验证、日志分析还是数据提取,都能凭借简洁的语法实现高效匹配。本文结合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正则

支持\d \w \s等预定义类,功能最全面

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开启调试模式,查看正则执行过程

四、实战避坑与高效技巧

  1. 区分“部分匹配”与“完全匹配”:无^$时,正则会匹配字符串中任意符合规则的子串,如需匹配整个字符串,务必添加边界符。

  2. 特殊字符转义:. * + ? | () [] ^ $等特殊字符,需用\转义才能匹配字面意义。

  3. 预定义类优先用:\d(数字)、\w(单词字符)、\s(空白字符)比手动写[0-9] [a-zA-Z_]更简洁,且兼容性更好。

  4. 复杂场景分段写:如IP、端口号等多规则场景,先拆分单个单元的正则,再组合整体,降低出错概率。

  5. 避免过度依赖正则:数值范围判断(如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}$

总结

正则表达式的核心是“用符号描述规律”,学习时无需死记硬背,先掌握^ $ . [] * + ?等基础符号,再通过经典例题拆解逻辑,最后结合实际场景练习,就能逐步熟练。记住:好的正则不仅要能匹配需求,还要具备可读性和可维护性,复杂场景记得分段设计、多加注释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值