正则表达式
-
-
- 正则表达式类型全景图
- 正则表达式类型对比表
- 基础元素字符表
- 一、基础正则表达式(BRE)
-
- [1. 文件内容匹配(grep)](#1. 文件内容匹配(grep))
- [2. 文本替换(sed)](#2. 文本替换(sed))
- 二、扩展正则表达式(ERE)
-
- [1. 多条件匹配(grep -E)](#1. 多条件匹配(grep -E))
- [2. 分组提取(awk)](#2. 分组提取(awk))
- 三、高级模式匹配
-
- 高级元字符
- [1. 零宽断言(匹配但不捕获)](#1. 零宽断言(匹配但不捕获))
- [2. 非贪婪匹配](#2. 非贪婪匹配)
- 四、实战应用场景
-
- [1. 日志错误提取](#1. 日志错误提取)
- [2. 配置文件解析](#2. 配置文件解析)
- [3. 数据验证](#3. 数据验证)
- 命令总结表格
- 功能作用详解
- [1. 正则表达式类型对比](#1. 正则表达式类型对比)
- [2. 核心元字符速查](#2. 核心元字符速查)
- [3. 分组与捕获](#3. 分组与捕获)
- [4. 实战技巧](#4. 实战技巧)
-
正则表达式类型全景图
正则表达式 基础正则 BRE 扩展正则 ERE Perl兼容 PCRE grep sed grep -E awk grep -P Python/Perl
正则表达式类型对比表
特性 |
BRE |
ERE |
PCRE |
适用场景 |
元字符转义 |
需转义+?{}() |
无需转义 |
无需转义 |
复杂模式 |
量词支持 |
* \+ \? \{n,m\} |
* + ? {n,m} |
* + ? {n,m} |
重复匹配 |
逻辑或 |
` |
` |
` |
` |
分组捕获 |
$ $ |
() |
() |
提取子串 |
零宽断言 |
不支持 |
不支持 |
支持 |
边界匹配 |
非贪婪匹配 |
不支持 |
不支持 |
*? +? |
HTML/XML解析 |
性能 |
高 |
中 |
低 |
大文件处理 |
基础元素字符表
元字符 |
功能 |
示例 |
匹配结果 |
. |
匹配任意字符 |
a.c |
"abc", "adc" |
^ |
行首锚定 |
^start |
"start line" |
$ |
行尾锚定 |
end$ |
"line end" |
* |
0次或多次 |
ab*c |
"ac", "abbc" |
+ |
1次或多次 |
ab+c |
"abc", "abbc" |
? |
0次或1次 |
ab?c |
"ac", "abc" |
[] |
字符组 |
[aeiou] |
"a", "e" |
[^] |
排除字符 |
[^0-9] |
"a", "B" |
` |
` |
或操作 |
`cat |
() |
分组捕获 |
(abc)+ |
"abc", "abcabc" |
一、基础正则表达式(BRE)
1. 文件内容匹配(grep)
bash
复制代码
# 创建测试文件
[root@localhost ~]# cat > test.txt <<EOF
apple
banana
cherry
12345
test@example.com
EOF
# 匹配纯数字行
[root@localhost ~]# grep '[0-9]\+' test.txt
12345
# 匹配邮箱地址
[root@localhost ~]# grep '[a-z]\+@[a-z]\+\.com' test.txt
test@example.com
2. 文本替换(sed)
bash
复制代码
# 替换所有数字为 #
[root@localhost ~]# sed 's/[0-9]\+/#/g' test.txt
apple
banana
cherry
#
test@example.com
# 删除空行
[root@localhost ~]# sed '/^$/d' test.txt
apple
banana
cherry
12345
test@example.com
二、扩展正则表达式(ERE)
1. 多条件匹配(grep -E)
bash
复制代码
# 匹配水果或邮箱
[root@localhost ~]# grep -E 'apple|banana|cherry|@' test.txt
apple
banana
cherry
test@example.com
# 匹配3位以上数字
[root@localhost ~]# grep -E '[0-9]{3,}' test.txt
12345
2. 分组提取(awk)
bash
复制代码
# 提取邮箱用户名和域名
[root@localhost ~]# awk '/@/ {match($0, /([a-z]+)@([a-z]+)\.com/, arr); print "用户:" arr[1], "域名:" arr[2]}' test.txt
用户:test 域名:example
三、高级模式匹配
高级元字符
元字符 |
功能 |
示例 |
匹配结果 |
\d |
数字 |
\d{3} |
"123" |
\w |
单词字符 |
\w+ |
"word" |
\s |
空白字符 |
\s+ |
" ", "\t" |
\b |
单词边界 |
\bword\b |
"word" |
(?=) |
正向预查 |
Windows(?=10) |
"Windows" in "Windows10" |
(? |
负向预查 |
Windows(?!7) |
"Windows" not in "Windows7" |
*? |
非贪婪匹配 |
<div>.*?</div> |
最短匹配 |
1. 零宽断言(匹配但不捕获)
bash
复制代码
# 匹配.com前的域名(不含.com)
[root@localhost ~]# grep -P 'example(?=\.com)' test.txt
test@example.com # 匹配到"example"
2. 非贪婪匹配
bash
复制代码
# 创建含HTML标签的测试文件
[root@localhost ~]# echo "<div>content</div>" > html.txt
# 非贪婪匹配(最短内容)
[root@localhost ~]# grep -P '<div>.*?</div>' html.txt
<div>content</div>
四、实战应用场景
1. 日志错误提取
bash
复制代码
# 生成日志文件
[root@localhost ~]# cat > app.log <<EOF
INFO: User login
ERROR: Database connection failed
WARN: Disk space low
ERROR: File not found
EOF
# 提取ERROR行及其描述
[root@localhost ~]# grep -oP 'ERROR: \K.*' app.log
Database connection failed
File not found
2. 配置文件解析
bash
复制代码
# 解析nginx配置提取监听端口
[root@localhost ~]# cat > nginx.conf <<EOF
server {
listen 80;
server_name localhost;
}
server {
listen 443 ssl;
server_name example.com;
}
EOF
[root@localhost ~]# grep -Po 'listen \K[0-9]+' nginx.conf
80
443
3. 数据验证
bash
复制代码
# 验证IP地址格式
[root@localhost ~]# ip="192.168.1.100"
[root@localhost ~]# if [[ $ip =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]]; then
> echo "有效IP"
> else
> echo "无效IP"
> fi
有效IP
命令总结表格
演示命令 |
功能描述 |
关键选项/语法 |
grep '[0-9]\+' file |
BRE数字匹配 |
\+ 一次或多次 |
`grep -E 'pattern1 |
pattern2'` |
ERE多条件匹配 |
sed 's/old/new/g' |
文本替换 |
s///g 全局替换 |
awk '/pattern/{print $0}' |
模式过滤 |
/regex/ 匹配行 |
grep -P 'regex' |
Perl兼容正则 |
-P 支持高级特性 |
[[ $var =~ regex ]] |
条件判断 |
=~ 正则匹配 |
功能作用详解
1. 正则表达式类型对比
类型 |
命令选项 |
支持特性 |
典型场景 |
BRE (基本正则) |
grep |
. * [ ] ^ $ |
简单匹配、基础文本处理 |
ERE (扩展正则) |
grep -E |
`+ ? |
() {}` |
PCRE (Perl兼容) |
grep -P |
零宽断言、非贪婪匹配 |
高级文本提取、日志分析 |
2. 核心元字符速查
元字符 |
BRE/ERE |
PCRE |
功能描述 |
. |
✓ |
✓ |
匹配任意单个字符(除换行) |
* |
✓ |
✓ |
前项匹配0次或多次 |
+ |
\+ (BRE) / + (ERE) |
✓ |
前项匹配1次或多次 |
? |
\? (BRE) / ? (ERE) |
✓ |
前项匹配0或1次 |
{n,m} |
\{n,m\} (BRE) / {n,m} (ERE) |
✓ |
匹配n到m次 |
` |
` |
` |
(BRE) / \ |
^ / $ |
✓ |
✓ |
行首/行尾锚定 |
\b |
✗ |
✓ |
单词边界 |
(?=) |
✗ |
✓ |
正向零宽断言 |
3. 分组与捕获
bash
复制代码
# 提取日期格式(YYYY-MM-DD)
echo "2025-07-28" | grep -Po '(\d{4})-(\d{2})-(\d{2})'
# 输出:2025-07-28
# 使用后向引用(sed)
echo "hello world" | sed 's/$hello$ $world$/\2 \1/'
# 输出:world hello
4. 实战技巧
日志分析
bash
复制代码
# 提取HTTP状态码
grep -Po 'HTTP/1.\d" \K[0-9]{3}' access.log
# 统计错误码分布
awk '/ERROR/{match($0, /ERROR: (.+)/, arr); print arr[1]}' app.log | sort | uniq -c
数据清洗
bash
复制代码
# 移除非数字字符
echo "Phone: (123) 456-7890" | sed 's/[^0-9]//g'
# 输出:1234567890
# 规范日期格式
echo "28/07/2025" | sed -E 's#([0-9]{2})/([0-9]{2})/([0-9]{4})#\3-\2-\1#'
# 输出:2025-07-28
配置管理
bash
复制代码
# 批量替换IP地址
sed -i 's/192\.168\.1\.[0-9]\+/10.0.0.1/g' *.conf
# 提取所有用户邮箱
grep -hoE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' /etc/passwd