什么是正则表达式?
正则表达式(Regular Expression,简称 Regex 或 RegExp)是一种强大的文本模式匹配工具。它就像一把"文字筛子",能够帮你从大量文本中快速找到符合特定规则的内容。
无论你是程序员、数据分析师,还是日常需要处理大量文本的普通用户,掌握正则表达式都能让你的工作效率提升数倍。
在 Shell 脚本编写中,以及在常用的文本处理工具——grep、sed、awk(被称为“文本处理三剑客”)中,正则表达式都是不可或缺的核心语法,用于模式匹配、文本筛选与内容替换。
为什么要学习正则表达式?
如果你经历过下面这些场景,可能会更能体会到正则表达式的强大之处:
- • 从几千个邮箱地址中筛选出所有 Gmail 邮箱
- • 从网页中提取所有的网址链接(网络爬虫脚本中常有类似需求)
这些任务如果手动处理会耗费大量时间,但使用正则表达式,几行代码就能搞定!
基础语法入门
1. 字面量匹配
最简单的正则表达式就是直接匹配文本:
正则:hello
匹配:hello world 中的 "hello"
2. 元字符
正则表达式的强大之处在于元字符,它们具有特殊含义:
- •
{m, n} - 前面的字符出现次数在 m 与 n 之间 - •
| - 表示“或(OR)”的逻辑关系,它用来匹配多个可能的子表达式之一
3. 字符类
用方括号 [] 定义字符集合:
[abc] 匹配 a、b 或 c
[0-9] 匹配任意数字
[a-z] 匹配任意小写字母
[A-Z] 匹配任意大写字母
[^abc] 匹配除了 a、b、c 之外的任意字符
4. 转义字符
\ 就是正则的转义字符(escape character),它有两种常见作用:
5. 预定义字符类
为了方便,正则表达式提供了常用的简写(大写字母用来表示小写字母的否定含义):
- •
\w - 匹配字母、数字、下划线,等价于 [A-Za-z0-9_]
实用案例解析
案例 1:验证邮箱地址
^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
解析:
- •
[a-zA-Z0-9._-]+ 用户名部分(字母数字及特殊符号) - •
[a-zA-Z]{2,} 顶级域名(至少2个字母)
案例 2:提取手机号码
1[3-9]\d{9}
解析:
案例 3:匹配 URL
https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/[^\s]*)?
解析:
- •
https? http 或 https(? 表示 s 可选)
案例 4:密码强度验证
要求:至少 8 位,包含大小写字母和数字
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$
解析:
- •
(?=.*[a-z]) 正向预查,确保有小写字母,参考下文高级技巧部分第 4 条
高级技巧
1. 分组与捕获
使用圆括号 () 创建分组:
(\d{4})-(\d{2})-(\d{2})
可以捕获日期的年、月、日三个部分。
2. 非捕获组
如果只想分组但不捕获,使用 (?:):
(?:http|https)://\w+
3. 贪婪与非贪婪匹配
<div>.*?</div> # 非贪婪,匹配最短的 div 标签
<div>.*</div> # 贪婪,可能匹配多个 div
4. 零宽断言(zero-width assertion)
- •
(?=...) - 正向肯定预查(后面必须满足)(?=Y) 匹配前面的内容,但要求后面紧跟 Y。 - •
(?!...) - 正向否定预查(后面不能满足)(?!Y) 匹配前面的内容,但要求后面不能是 Y。 - •
(?<=...) - 反向肯定预查(前面必须满足)(?<=Y)匹配后面的内容,但要求前面必须是 Y。 - •
(?<!...) - 反向否定预查(前面不能满足)(?<!Y) 匹配后面的内容,但要求前面不能是 Y。
\w+(?=:) #匹配冒号前面的单词,例如:user:admin,匹配结果为"user"
foo(?!bar) # 匹配 "foo",但后面不能跟 "bar"。例如: foobar → ❌ 不匹配 foo123 → ✅ 匹配
(?<=@)\w+ #匹配邮箱中 @ 后面的用户名部分,例如:user@example.com,匹配结果为"example"
(?<!@)\b\w+\b #匹配所有不在 @ 后的单词,例如:email@example.com hello world,匹配结果为"email, hello, world"
常用工具推荐
学习和测试正则表达式,这些工具非常有用:
- 1. Regex101 (https://regex101.com) - 在线测试,提供详细解释
- 2. RegExr (https://regexr.com) - 可视化正则表达式
- 3. 正则表达式教程(https://regexper.cn)- 中文教程
- 4. IDE 内置工具 - VS Code、IntelliJ IDEA 等都支持正则搜索
注意事项
- 1. 性能问题:复杂的正则表达式可能导致性能问题,尤其是回溯过多时
- 2. 可读性:过于复杂的正则很难维护,建议添加注释或拆分
- 3. 转义字符:特殊字符需要转义,如
. → \. - 4. 不同语言的差异:各编程语言的正则实现略有差异,使用时注意查阅文档
实践建议
- 1. 从简单开始:先掌握基础语法,再逐步学习高级特性
结语
不管你想掌握哪一门编程语言,正则表达式都是都绕不过去的必备技能之一,虽然初看复杂,但掌握后会成为你的得力助手。不要被眼花缭乱的符号吓倒,从简单的模式开始,逐步练习,你会发现正则表达式其实没那么难!
正则表达式的核心是"模式匹配",理解了这个概念,剩下的就是熟悉各种符号的用法了。
现在就开始你的正则表达式学习之旅吧!
阅读原文:原文链接
该文章在 2025/12/10 18:33:56 编辑过