正则表达式(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
文件
-
通配符(用于文件名):
bashfd "*.txt" # 匹配 a.txt, file.txt
*
直接表示任意字符。 -
正则表达式(用于文本内容):
bashrg ".*\.txt$" # 匹配行尾的 ".txt"
.*
匹配任意字符(包括空)。\.
转义点号。$
匹配行尾。
示例2:匹配 file1
到 file9
-
通配符:
bashfd "file[1-9]" # 匹配 file1, file2, ..., file9
-
正则表达式:
bashrg "file[1-9]" # 匹配文本中的 "file1" 到 "file9"
示例3:匹配以 a
开头、以 z
结尾的字符串
-
正则表达式:
bashrg "^a.*z$" # 匹配 "abz", "a123z"
^a
开头是a
。.*
中间任意字符。z$
结尾是z
。
-
通配符(无法直接实现,需近似):
bashfd "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
启用正则。bashfd -g "*.py" # 通配符模式 fd --regex "[a-z]+" # 正则模式
-
ripgrep
(rg
) 命令 :默认用正则表达式,通配符需转义或通过其他参数实现。
bashrg ".*\.rs$" # 正则匹配.rs文件内容
总结表
特性 | 正则表达式 | 通配符 |
---|---|---|
用途 | 文本内容匹配 | 文件名/路径匹配 |
复杂度 | 高(支持分组、量词等) | 低(简单模式) |
常用符号 | .* , ^ , $ , \d |
* , ? , [...] |
工具示例 | rg , sed , grep -E |
fd , find , ls *.txt |
掌握两者的区别可以避免混淆,根据场景选择合适工具!