正则表达式和通配符

正则表达式(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

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

相关推荐
htj1014 小时前
C# 使用正则表达式
正则表达式·c#
ZZZKKKRTSAE14 小时前
快速上手Linux全局搜索正则表达式(grep)
linux·服务器·正则表达式
Kusunoki_D1 天前
Python-正则表达式(re 模块)
python·正则表达式
数字芯片实验室1 天前
正则表达式的前世今生
正则表达式
Lenyiin2 天前
《 C++ 点滴漫谈: 四十 》文本的艺术:C++ 正则表达式的高效应用之道
c++·正则表达式·lenyiin
AA-代码批发V哥2 天前
Java正则表达式完全指南
java·正则表达式
coding随想3 天前
JavaScript中的正则表达式:文本处理的瑞士军刀
javascript·mysql·正则表达式
OldField-Tian3 天前
Qt中使用正则表达式来提取字符串
qt·正则表达式
datascome4 天前
简数采集技巧之快速获取特殊链接网址URL方法
前端·经验分享·爬虫·程序人生·正则表达式
WebCsDn_TDCode4 天前
正则表达式检测文件类型是否为视频或图片
javascript·正则表达式·音视频