文章目录
- 1. 正则表达式定义
- 2. 基础正则表达式(BRE)
- 3. 扩展正则表达式(ERE)
- 4. 通配符(Wildcards)
- 5. 案例与分析
- **案例1:提取IP地址**
- **案例2:批量重命名文件**
- **案例3:过滤日志中的错误信息**
- **案例4:匹配邮箱地址**
- 总结
1. 正则表达式定义
正则表达式(Regular Expression,简称 regex) 是一种通过特定语法规则描述字符串模式的工具,用于匹配、搜索、替换文本。其核心由普通字符(如字母、数字)和元字符(特殊符号)组成,能够灵活定义复杂的匹配规则。
应用场景:
- 文本搜索(如
grep
) - 字符串替换(如
sed
) - 数据验证(如表单输入)
- 日志分析
2. 基础正则表达式(BRE)
基础正则表达式是正则表达式的早期标准,需用 \
转义部分元字符,支持以下核心语法:
元字符 | 说明 | 示例 |
---|---|---|
. | 匹配任意单个字符(除换行符) | a.c → abc , aXc |
^ | 匹配字符串开头 | ^start → 以start 开头的行 |
$ | 匹配字符串结尾 | end$ → 以end 结尾的行 |
* | 前一个字符出现0次或多次 | ab*c → ac , abbc |
\+ | 前一个字符出现1次或多次 | a\+b → ab , aaab |
\? | 前一个字符出现0次或1次 | a\?b → b , 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?b → b , ab |
{n} | 前一个字符出现n次 | a{3} → aaa |
{n,m} | 前一个字符出现n到m次 | a{2,4} → aa , aaaa |
` | ` | 逻辑“或” |
() | 分组,可结合 ` | ` 使用 |
特点:
- 无需转义
+
,?
,{ }
,|
,()
。 - 使用
egrep
或grep -E
启用扩展模式。
4. 通配符(Wildcards)
通配符用于文件名匹配(如 ls
, find
),语法与正则表达式不同:
通配符 | 说明 | 示例 |
---|---|---|
* | 匹配任意数量任意字符 | *.txt → 所有.txt文件 |
? | 匹配单个任意字符 | file?.log → file1.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:过滤日志中的错误信息
目标:从日志文件中提取包含 ERROR
或 WARN
的行。
正则表达式:
grep -E 'ERROR|WARN' app.log
|
:逻辑“或”,匹配ERROR
或WARN
。-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文本处理的必备技能,通过案例实践可快速提升熟练度!