正则表达式详解与实战示例

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      # 匹配"ab", "aab"

# 扩展正则(-E 或 egrep)
grep -E "a+b" file.txt    # 同上,写法更简洁

# 常用选项:
grep -i "hello" file      # 忽略大小写
grep -v "error" file      # 反向匹配(不包含error的行)
grep -n "pattern" file    # 显示行号

4.2 sed 替换

# 替换所有数字为X
sed -E 's/[0-9]/X/g' file.txt

# 删除空行
sed '/^$/d' file.txt

# 替换分组内容(扩展正则)
echo "foo=123" | sed -E 's/(foo)=([0-9]+)/\2:\1/'  # 输出"123:foo"

4.3 awk 匹配

# 打印包含"error"的行
awk '/error/{print $0}' file.log

# 提取IP地址
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}$

# 强密码(至少8位,含大小写和数字)
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\w!@#$%^&*]{8,}$

5.2 文本提取

# 提取HTML标签内容
<h1>(.*?)</h1>

# 提取URL中的域名
https?://([^/]+)

# 匹配16进制颜色码
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$

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. 调试技巧

  1. 在线测试工具
  2. 逐步构建:从简单模式开始测试,逐步增加复杂度
  3. 性能注意:避免.*过度匹配,优先使用.*?(非贪婪模式)

黄金法则

  • 明确你要匹配的文本特征
  • 先用简单模式测试核心逻辑
  • 最后添加边界条件(如^$
作者:admin  创建时间:2025-05-29 09:51
最后编辑:admin  更新时间:2025-05-29 13:26