正则表达式详解与实战示例
1. 正则表达式基础概念
1.1 什么是正则表达式?
正则表达式(Regular Expression)是用于匹配字符串模式的强大工具,广泛应用于:
- 文本搜索/替换
- 数据验证(如邮箱、手机号格式)
- 日志分析
- 编程语言中的字符串处理
1.2 两种语法风格
类型 |
说明 |
示例 |
基本正则 |
需转义特殊字符 |
grep "a\+b" |
扩展正则 |
无需转义多数符号 |
grep -E "a+b" |
2. 元字符详解
2.1 基础元字符
元字符 |
作用 |
示例 |
匹配示例 |
. |
匹配任意单个字符 |
a.c |
“abc”, “a1c” |
^ |
匹配行开头 |
^Hello |
“Hello world” |
$ |
匹配行结尾 |
world$ |
“Hello world” |
* |
前导字符出现0次或多次 |
ab*c |
“ac”, “abbc” |
+ |
前导字符出现1次或多次 |
ab+c |
“abc”, “abbc” |
? |
前导字符出现0次或1次 |
ab?c |
“ac”, “abc” |
| |
或逻辑 |
cat|dog |
“cat”, “dog” |
2.2 字符类
表达式 |
作用 |
示例 |
匹配示例 |
[abc] |
匹配a/b/c中任意一个 |
gr[ae]y |
“gray”, “grey” |
[^abc] |
匹配非a/b/c的字符 |
[^0-9] |
“a”, “B” |
[a-z] |
匹配小写字母 |
[a-z]+ |
“hello” |
\d |
匹配数字(等价[0-9] ) |
\d{3} |
“123” |
\w |
匹配单词字符(字母/数字/下划线) |
\w+ |
“user_1” |
3. 量词与分组
3.1 量词
量词 |
作用 |
示例 |
匹配示例 |
{n} |
精确匹配n次 |
a{3} |
“aaa” |
{n,} |
匹配至少n次 |
a{2,} |
“aa”, “aaaa” |
{n,m} |
匹配n到m次 |
a{2,4} |
“aa”, “aaa” |
3.2 分组与捕获
表达式 |
作用 |
示例 |
(abc) |
分组并捕获 |
(ab)+ → “abab” |
(?:abc) |
分组不捕获 |
(?:ab)+ |
\1 |
引用第一个分组 |
(a)b\1 → “aba” |
4. 扩展正则命令实战
4.1 grep 命令
grep "a\+b" file.txt
grep -E "a+b" file.txt
grep -i "hello" file
grep -v "error" file
grep -n "pattern" file
4.2 sed 替换
sed -E 's/[0-9]/X/g' file.txt
sed '/^$/d' file.txt
echo "foo=123" | sed -E 's/(foo)=([0-9]+)/\2:\1/'
4.3 awk 匹配
awk '/error/{print $0}' file.log
echo "IP: 192.168.1.1" | awk -F: '/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/{print $2}'
5. 经典示例大全
5.1 数据验证
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
^(?:\+?86)?1[3-9]\d{9}$
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\w!@
5.2 文本提取
<h1>(.*?)</h1>
https?:
^
5.3 日志分析
# 从Nginx日志提取IP和访问路径
grep -Eo '^[0-9.]+ .*?"GET ([^ ]+)' access.log
# 统计错误码出现次数
awk '/HTTP\/1.[01]" [4-5][0-9]{2}/{print $9}' access.log | sort | uniq -c
6. 工具对比
工具 |
适用场景 |
正则支持 |
grep |
快速文本搜索 |
基础/扩展正则 |
sed |
流编辑(替换/删除) |
扩展正则 |
awk |
结构化文本处理 |
扩展正则 |
perl |
复杂正则操作 |
PCRE(最强) |
7. 调试技巧
- 在线测试工具:
- 逐步构建:从简单模式开始测试,逐步增加复杂度
- 性能注意:避免
.*
过度匹配,优先使用.*?
(非贪婪模式)
黄金法则:
- 明确你要匹配的文本特征
- 先用简单模式测试核心逻辑
- 最后添加边界条件(如
^$
)
作者:admin 创建时间:2025-05-29 09:51
最后编辑:admin 更新时间:2025-05-29 13:26