正则表达式和通配符
正则表达式(Regular Expression)和通配符(Glob Pattern)是两种不同的模式匹配语法,虽然看起来相似(都使用 *、? 等符号),但它们的用途、规则和场景完全不同。以下是它们的核心区别和示例:
1. 设计目的
-  
正则表达式
用于匹配文本内容(如文件内容、字符串),功能强大且灵活,支持复杂逻辑(如分组、回溯、量词)。
工具示例:grep、ripgrep、sed、Perl、编程语言中的正则库。 -  
通配符
用于匹配文件名或路径(如*.txt),语法简单,主要用于文件操作。
工具示例:fd、find -name、Shell 的文件扩展(如ls *.txt)。 
2. 核心符号对比
| 符号 | 正则表达式含义 | 通配符含义 | 
|---|---|---|
* | 匹配前一个字符的0次或多次 | 匹配任意数量的任意字符(包括0个) | 
? | 匹配前一个字符的1次 | 匹配单个任意字符 | 
[...] | 匹配括号内的任意一个字符 | 同正则(如 [a-z] 匹配小写字母) | 
[^...] | 匹配不在括号内的字符 | 同正则 | 
^ | 匹配行首 | 无特殊含义(普通字符) | 
$ | 匹配行尾 | 无特殊含义(普通字符) | 
.* | 匹配任意字符(包括空字符串) | 无(需用 * 单独实现) | 
\ | 转义字符 | 同正则 | 
3. 典型示例对比
示例1:匹配所有 .txt 文件
 
-  
通配符(用于文件名):
fd "*.txt" # 匹配 a.txt, file.txt*直接表示任意字符。 -  
正则表达式(用于文本内容):
rg ".*\.txt$" # 匹配行尾的 ".txt".*匹配任意字符(包括空)。\.转义点号。$匹配行尾。
 
示例2:匹配 file1 到 file9
 
-  
通配符:
fd "file[1-9]" # 匹配 file1, file2, ..., file9 -  
正则表达式:
rg "file[1-9]" # 匹配文本中的 "file1" 到 "file9" 
示例3:匹配以 a 开头、以 z 结尾的字符串
 
-  
正则表达式:
rg "^a.*z$" # 匹配 "abz", "a123z"^a开头是a。.*中间任意字符。z$结尾是z。
 -  
通配符(无法直接实现,需近似):
fd "a*z" # 匹配文件名如 "abz", "a_file_z"*不保证中间字符的精确控制。 
4. 使用场景
-  
用通配符(Glob)的场景:
- 快速匹配文件名(如 
rm *.log)。 - 文件批量操作(如 
mv /path/*.jpg ./images)。 - Shell 命令中的路径扩展(如 
ls data/*.csv)。 
 - 快速匹配文件名(如 
 -  
用正则表达式的场景:
- 搜索文件内容(如 
rg "\d{3}-\d{4}"匹配电话号码)。 - 文本替换(如 
sed -E 's/^(.*)/Prefix: \1/' file.txt)。 - 编程中的字符串验证(如邮箱格式校验)。
 
 - 搜索文件内容(如 
 
5. 工具中的默认模式
-  
fd命令:
默认用通配符(-g),需--regex启用正则。fd -g "*.py" # 通配符模式 fd --regex "[a-z]+" # 正则模式 -  
ripgrep(rg) 命令:
默认用正则表达式,通配符需转义或通过其他参数实现。rg ".*\.rs$" # 正则匹配.rs文件内容 
总结表
| 特性 | 正则表达式 | 通配符 | 
|---|---|---|
| 用途 | 文本内容匹配 | 文件名/路径匹配 | 
| 复杂度 | 高(支持分组、量词等) | 低(简单模式) | 
| 常用符号 | .*, ^, $, \d | *, ?, [...] | 
| 工具示例 | rg, sed, grep -E | fd, find, ls *.txt | 
掌握两者的区别可以避免混淆,根据场景选择合适工具!
