银川建企业模板网站网页制作企业网站作业
正则表达式(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 |
掌握两者的区别可以避免混淆,根据场景选择合适工具!
