正则表达式和通配符

正则表达式(Regular Expression)和通配符(Glob Pattern)是两种不同的模式匹配语法,虽然看起来相似(都使用 *? 等符号),但它们的用途、规则和场景完全不同。以下是它们的核心区别和示例:


1. 设计目的

  • 正则表达式

    用于匹配文本内容 (如文件内容、字符串),功能强大且灵活,支持复杂逻辑(如分组、回溯、量词)。
    工具示例grepripgrepsedPerl、编程语言中的正则库。

  • 通配符

    用于匹配文件名或路径 (如 *.txt),语法简单,主要用于文件操作。
    工具示例fdfind -name、Shell 的文件扩展(如 ls *.txt)。


2. 核心符号对比

符号 正则表达式含义 通配符含义
* 匹配前一个字符的0次或多次 匹配任意数量的任意字符(包括0个)
? 匹配前一个字符的1次 匹配单个任意字符
[...] 匹配括号内的任意一个字符 同正则(如 [a-z] 匹配小写字母)
[^...] 匹配不在括号内的字符 同正则
^ 匹配行首 无特殊含义(普通字符)
$ 匹配行尾 无特殊含义(普通字符)
.* 匹配任意字符(包括空字符串) 无(需用 * 单独实现)
\ 转义字符 同正则

3. 典型示例对比

示例1:匹配所有 .txt 文件
  • 通配符(用于文件名):

    bash 复制代码
    fd "*.txt"        # 匹配 a.txt, file.txt

    * 直接表示任意字符。

  • 正则表达式(用于文本内容):

    bash 复制代码
    rg ".*\.txt$"     # 匹配行尾的 ".txt"
    • .* 匹配任意字符(包括空)。
    • \. 转义点号。
    • $ 匹配行尾。
示例2:匹配 file1file9
  • 通配符

    bash 复制代码
    fd "file[1-9]"    # 匹配 file1, file2, ..., file9
  • 正则表达式

    bash 复制代码
    rg "file[1-9]"    # 匹配文本中的 "file1" 到 "file9"
示例3:匹配以 a 开头、以 z 结尾的字符串
  • 正则表达式

    bash 复制代码
    rg "^a.*z$"       # 匹配 "abz", "a123z"
    • ^a 开头是 a
    • .* 中间任意字符。
    • z$ 结尾是 z
  • 通配符(无法直接实现,需近似):

    bash 复制代码
    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 启用正则。

    bash 复制代码
    fd -g "*.py"          # 通配符模式
    fd --regex "[a-z]+"   # 正则模式
  • ripgrep (rg) 命令

    默认用正则表达式,通配符需转义或通过其他参数实现。

    bash 复制代码
    rg ".*\.rs$"          # 正则匹配.rs文件内容

总结表

特性 正则表达式 通配符
用途 文本内容匹配 文件名/路径匹配
复杂度 高(支持分组、量词等) 低(简单模式)
常用符号 .*, ^, $, \d *, ?, [...]
工具示例 rg, sed, grep -E fd, find, ls *.txt

掌握两者的区别可以避免混淆,根据场景选择合适工具!

相关推荐
qq_543248521 天前
正则表达式三剑客之——awk命令
正则表达式
qq_543248521 天前
正则表达式三剑客之——grep和sed
linux·运维·正则表达式
Ankie Wan2 天前
notepad++技巧:查找和替换:扩展 or 正则表达式
python·正则表达式·notepad++
Python智慧行囊3 天前
正则表达式:从入门到实战的全面指南
正则表达式
DKPT4 天前
常见正则表达式整理与Java使用正则表达式的例子
java·笔记·学习·面试·正则表达式
DKPT4 天前
正则表达式
java·数据库·笔记·学习·正则表达式
余生大大4 天前
关于Safari浏览器在ios<16.3版本不支持正则表达式零宽断言的解决办法
ios·正则表达式·safari
程序员沉梦听雨4 天前
正则表达式学习指南
正则表达式
其实你热情似火5 天前
Java基础第21天-正则表达式
java·开发语言·正则表达式
DKPT5 天前
正则表达式与python使用
笔记·python·学习·面试·正则表达式