详解正则表达式与案例

发布于:2025-02-10 ⋅ 阅读:(26) ⋅ 点赞:(0)

1. 正则表达式定义

正则表达式(Regular Expression,简称 regex) 是一种通过特定语法规则描述字符串模式的工具,用于匹配、搜索、替换文本。其核心由普通字符(如字母、数字)和元字符(特殊符号)组成,能够灵活定义复杂的匹配规则。

应用场景

  • 文本搜索(如 grep
  • 字符串替换(如 sed
  • 数据验证(如表单输入)
  • 日志分析

2. 基础正则表达式(BRE)

基础正则表达式是正则表达式的早期标准,需用 \ 转义部分元字符,支持以下核心语法:

元字符 说明 示例
. 匹配任意单个字符(除换行符) a.cabc, aXc
^ 匹配字符串开头 ^start → 以start开头的行
$ 匹配字符串结尾 end$ → 以end结尾的行
* 前一个字符出现0次或多次 ab*cac, abbc
\+ 前一个字符出现1次或多次 a\+bab, aaab
\? 前一个字符出现0次或1次 a\?bb, ab
\{n\} 前一个字符出现n次 a\{3\}aaa
\{n,m\} 前一个字符出现n到m次 a\{2,4\}aa, aaaa
[ ] 匹配括号内任意一个字符 [aeiou] → 匹配任意元音字母
[^ ] 匹配不在括号内的字符 [^0-9] → 匹配非数字字符
\ 转义特殊字符 \. → 匹配字面意义的.

特点

  • 需用 \ 转义元字符如 \+, \?, \{ \}
  • 默认不支持 |(或)和 ()(分组)。

3. 扩展正则表达式(ERE)

扩展正则表达式简化了语法,无需转义部分元字符,支持更复杂的逻辑:

元字符 说明 示例
+ 前一个字符出现1次或多次 ab+ab, abbb
? 前一个字符出现0次或1次 a?bb, ab
{n} 前一个字符出现n次 a{3}aaa
{n,m} 前一个字符出现n到m次 a{2,4}aa, aaaa
` ` 逻辑“或”
() 分组,可结合 ` ` 使用

特点

  • 无需转义 +, ?, { }, |, ()
  • 使用 egrepgrep -E 启用扩展模式。

4. 通配符(Wildcards)

通配符用于文件名匹配(如 ls, find),语法与正则表达式不同:

通配符 说明 示例
* 匹配任意数量任意字符 *.txt → 所有.txt文件
? 匹配单个任意字符 file?.logfile1.log, fileA.log
[ ] 匹配括号内任意一个字符 [abc]* → 以a、b、c开头的文件
[^ ] 排除括号内的字符 [^0-9]* → 不以数字开头的文件

注意

  • 通配符由Shell解析,正则表达式由文本工具(如 grep, sed)解析。
  • 通配符的 *? 不同于正则表达式中的含义。

5. 案例与分析

案例1:提取IP地址

目标:从文本中提取 IPv4 地址(如 192.168.1.1)。

正则表达式

grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt
  • [0-9]{1,3}:匹配0-999的数字。
  • \.:匹配点号。
  • {3}:前一部分重复3次(即前三段IP)。
  • -E:启用扩展正则表达式。

案例2:批量重命名文件

目标:将 file1.txt, file2.txt 重命名为 backup1.txt, backup2.txt

通配符 + Shell命令

for f in file*.txt; do mv "$f" "backup${f#file}"; done
  • file*.txt:匹配所有以 file 开头、.txt 结尾的文件。
  • ${f#file}:删除文件名中的 file 前缀。

案例3:过滤日志中的错误信息

目标:从日志文件中提取包含 ERRORWARN 的行。

正则表达式

grep -E 'ERROR|WARN' app.log
  • |:逻辑“或”,匹配 ERRORWARN
  • -E:启用扩展正则表达式。

案例4:匹配邮箱地址

目标:验证简单的邮箱格式(如 user@example.com)。

正则表达式

grep -E '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' emails.txt
  • ^$:严格匹配整个字符串。
  • [a-zA-Z0-9._%+-]+:用户名部分(允许字母、数字、符号)。
  • @.:匹配邮箱中的固定符号。
  • [a-zA-Z]{2,}:域名后缀(如 com, org)。

总结

工具 用途 关键区别
正则表达式 文本内容匹配(grep, sed 语法复杂,支持分组、量词、逻辑或
通配符 文件名匹配(ls, find 语法简单,由Shell解析

核心技巧

  • 区分场景:通配符用于文件名,正则表达式用于文本内容。
  • 转义规则:BRE需转义 +, ?, { },ERE无需转义。
  • 贪婪匹配:正则表达式默认贪婪匹配(如 .* 会匹配最长可能字符串)。

掌握正则表达式和通配符是Linux文本处理的必备技能,通过案例实践可快速提升熟练度!


网站公告

今日签到

点亮在社区的每一天
去签到