正则表达式 – 匹配规则(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

正则表达式(Regular Expression,简称 regex 或 regexp)是编程中用于文本匹配和处理的强大工具,尤其在数据清洗、输入验证、文本解析等场景中不可或缺。其核心在于通过特定的语法规则,定义文本的“匹配模式”。对于编程初学者而言,正则表达式可能显得抽象难懂,但掌握其基础规则后,它将成为提升开发效率的利器。本文将从 正则表达式 – 匹配规则 出发,通过循序渐进的讲解、实际案例和代码示例,帮助读者逐步理解这一工具的逻辑与应用。


一、基础语法:正则表达式的“乐高积木”

正则表达式的核心是通过字符和符号的组合,构建一个“模式模板”。我们可以将其类比为乐高积木:基础字符是积木块,而特殊符号(如 .*+)则是连接器或特殊功能模块。

1.1 简单字符匹配

最基本的规则是直接匹配字符。例如:

  • 正则表达式 hello 会匹配字符串中的“hello”;
  • 正则表达式 123 会匹配数字序列“123”。

注意

  • 大小写敏感。例如,Hellohello 是不同的模式;
  • 特殊字符(如 .*)需要转义。例如,匹配字符 . 需要写成 \.

示例(Python):

import re  
text = "hello world"  
pattern = r"hello"  
if re.search(pattern, text):  
    print("匹配成功!")  # 输出结果:匹配成功!  

二、元字符详解:赋予正则表达式“超能力”的符号

元字符是正则表达式中具有特殊含义的符号,它们能扩展匹配的灵活性。

2.1 点号 .:匹配任意单个字符(除换行符)

  • . 可以代表除换行符外的任意字符。例如:
    • h.llo 匹配 "hello"、"hxllo"、"h2llo" 等;
    • a..b 匹配 "a12b"、"aXb" 等。

2.2 字符集 []:定义可选字符的“菜单”

  • [] 内的字符会形成一个集合,匹配其中任意一个字符。例如:
    • [abc] 匹配 "a"、"b" 或 "c";
    • [0-9] 匹配任意数字;
    • [A-Za-z] 匹配任意字母(大小写均可)。

2.3 否定字符集 [^...]:排除特定字符

  • [^...] 匹配不在集合内的任意字符。例如:
    • [^0-9] 匹配非数字字符;
    • [^aeiou] 匹配非元音字母。

示例(JavaScript):

const text = "apple123";  
const pattern = /[A-Za-z]/g;  // 匹配所有字母  
console.log(text.match(pattern));  // 输出:["a", "p", "p", "l", "e"]  

三、量词:控制匹配的“数量规则”

量词用于指定前面的字符或组需要出现的次数。常见的量词包括:

3.1 *:匹配零次或多次

  • .* 表示匹配任意字符(除换行符)零次或多次。例如:
    • colou?r 匹配 "color" 或 "colour"(? 是量词,表示可有可无)。

3.2 +:匹配一次或多次

  • a+b 匹配 "ab"(a 出现一次)、"aab"、"aaab" 等,但不匹配 "b"(a 未出现)。

3.3 ?:匹配零次或一次

  • co?m 匹配 "cm" 或 "com"。

3.4 {m,n}:指定出现次数的范围

  • a{2,4} 匹配 "aa"(2次)、"aaa"(3次)或 "aaaa"(4次)。

示例(Python):

text = "aaaab"  
pattern = r"a{3,5}b"  
match = re.match(pattern, text)  
print(match.group())  # 输出:"aaaab"(a 出现4次,符合3-5的范围)  

四、分组与捕获:提取复杂模式的“寻宝图”

分组(())允许将多个字符组合为一个单元,并支持捕获、引用等功能。

4.1 捕获组:提取子字符串

  • 使用 () 将需要捕获的部分包裹起来,后续可通过编号引用。例如:
    • 正则表达式 (\d{4})-(\d{2}) 匹配日期格式 "2023-09",并捕获年份和月份。

示例(JavaScript):

const text = "订单号:2023-09-15";  
const pattern = /(\d{4})-(\d{2})/;  
const matches = text.match(pattern);  
console.log(matches[1]);  // 输出:"2023"(年份)  
console.log(matches[2]);  // 输出:"09"(月份)  

4.2 非捕获组:仅分组,不保存结果

  • 使用 (?:...) 表示非捕获组,常用于逻辑分组。例如:
    • (?:a|b)c 匹配 "ac" 或 "bc",但不会保存中间结果。

五、边界匹配:定义匹配的“起终点”

边界符用于限定匹配的位置,确保模式出现在文本的特定位置。

5.1 ^:匹配字符串开头

  • ^hello 只匹配以 "hello" 开头的字符串。

5.2 $:匹配字符串结尾

  • world$ 只匹配以 "world" 结尾的字符串。

5.3 \b:匹配单词边界

  • \bword\b 匹配独立的单词 "word",但不匹配 "sword" 或 "wordy"。

示例(Python):

text = "hello world"  
if re.match(r"^hello", text):  
    print("开头匹配!")  # 输出结果:开头匹配!  

六、实战案例:正则表达式的“真实战场”

6.1 验证邮箱地址

邮箱地址的格式通常为 username@domain.com。其正则表达式可简化为:

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$  
  • 解释
    • ^:从开头开始匹配;
    • [a-zA-Z0-9._%+-]+:用户名部分,允许字母、数字及特殊符号;
    • @:必须包含 @ 符号;
    • [a-zA-Z0-9.-]+:域名部分,允许字母、数字及点号;
    • \.[a-zA-Z]{2,}$:以 . 开头的顶级域名(如 .com、.org)。

示例(JavaScript):

const email = "user.name+tag+sorting@example.com";  
const pattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;  
console.log(pattern.test(email));  // 输出:true  

6.2 提取电话号码

假设电话号码格式为 138-1234-5678,正则表达式为:

\d{3}-\d{4}-\d{4}  
  • 解释
    • \d{3}:三位数字;
    • -:连接符;
    • \d{4}:四位数字(两次)。

示例(Python):

text = "联系方式:138-1234-5678"  
pattern = r"\d{3}-\d{4}-\d{4}"  
match = re.search(pattern, text)  
print(match.group())  # 输出:"138-1234-5678"  

七、进阶技巧:避免“贪婪匹配”陷阱

正则表达式默认采用“贪婪匹配”模式,即尽可能匹配最长的字符串。例如:

  • 正则表达式 <.*> 在匹配 "text" 时,会匹配到整个字符串,而非单个标签。
  • 解决方法:在量词后添加 ? 转为“非贪婪匹配”。例如 <.*?>

八、常见误区与调试建议

8.1 特殊字符未转义

例如,直接使用 . 匹配句号时,需写成 \.

8.2 忽略边界条件

例如,匹配邮箱时未考虑大小写或特殊字符,可能导致漏洞。

8.3 调试工具推荐

  • 在线工具:regex101.com 可实时测试正则表达式;
  • 编程语言内置功能:如 Python 的 re.DEBUG 参数。

结论

正则表达式 – 匹配规则是编程中不可或缺的技能,它通过灵活的语法和强大的表达能力,帮助开发者高效处理文本数据。本文从基础语法、元字符、量词到实战案例,逐步解析了这一工具的核心逻辑。建议读者通过不断练习(如编写验证规则、解析日志等任务)加深理解。掌握正则表达式后,您将能够更自信地应对复杂的文本处理场景,提升代码的简洁性和效率。

关键词布局

  • “正则表达式 – 匹配规则”在标题及段落中自然出现;
  • 核心概念如“元字符”“量词”“分组”贯穿全文,强化主题关联性。

最新发布