一、正则表达式
1.1、含义
用于匹配字符串的表达式。
1.2、实现
正则表达式具有很多变种,比如:GNU BRE,GNU ERE,POSIX BRE,POSIX ERE,JDK正则表达式,Python正则表达式,Perl正则表达式,PCRE正则表达式等。
不同变种支持的语法大同小异,没有必要掌握所有的变种语法,根据几个变种语法触类旁通其他变种语法即可(细节差异可查阅具体文档手册)。
不过,正则表达式有一个特殊的变种——通配符模式表达式,接下来进行单独介绍。
二、通配符模式表达式
2.1、含义
“通配符模式表达式”是“正则表达式”的变种,它跟“一般正则表达式”最显著的区别是:在“一般正则表达式”中,“*”表示“前面的元素出现0次或者任意多次”,“?”表示“前面的元素出现0次或者1次”;在“通配符模式表达式”中,“*”表示“任意字符串,包括空字符串”,“?”表示“任意单个字符”。
通配符模式表达式一般常用于匹配文件路径字符串的场景。
2.2、实现
跟“一般正则表达式”具有很多变种一样,“通配符模式表达式”也具有很多变种,比如:Linux Shell通配符模式表达式,GNU tar命令通配符模式表达式,GNU find命令通配符模式表达式等。
接下来针对上述3个变种进行简要介绍,首先说明当前目录结构如下:
1 | ├── a.txt |
2.3、3个变种的简要介绍
2.3.1、Linux Shell通配符模式表达式
Linux Shell(比如“Bash Shell”)在执行命令之前会对命令字符串进行解析,包括对“通配符模式表达式”的解析(比如rm *.txt
命令中的“*.txt”),Linux Shell解析器所支持的“通配符模式表达式”被称为“Linux Shell通配符模式表达式”。
接下来是两点说明:
1、为防止命令字符串中的“某个表达式”被误认为是“Linux Shell通配符模式表达式”而被误解析,可将该表达式嵌在''
或者""
对之间
2、Linux Shell通配符模式表达式中的“*”通配符不包含对“/”字符的匹配。比如在当前目录执行rm d*f.txt
命令,得到/bin/rm: 无法删除"d*f.txt": 没有那个文件或目录
结果;又比如在当前目录执行rm *.txt
命令,只会删除“a.txt”和“b.txt”文件
2.3.2、GNU tar命令通配符模式表达式
GNU tar命令有一个“–exclude=PATTERN”选项,其中的“PATTERN”是通配符模式表达式,它由tar命令进行解析,tar命令解析器所支持的“通配符模式表达式”被称为“GNU tar命令通配符模式表达式”。
接下来是一点说明:
1、GNU tar命令通配符模式表达式中的“*”通配符包含对“/”字符的匹配。比如在当前目录执行tar --exclude='d*f.txt' -czvf a.tar.gz .
命令,“d/f.txt”文件未被打包;又比如在当前目录执行tar --exclude='*.txt' -czvf a.tar.gz .
命令,则所有的TXT文件都未被打包
2.3.3、GNU find命令通配符模式表达式
GNU find命令有一个“-path PATTERN”选项,其中的“PATTERN”是通配符模式表达式,它由find命令进行解析,find命令解析器所支持的“通配符模式表达式”被称为“GNU find命令通配符模式表达式”。
接下来是一点说明:
1、GNU find命令通配符模式表达式中的“*”通配符包含对“/”字符的匹配。比如在当前目录执行find . -path './d*'
命令,能够找到“d”目录,“d/g.txt”和“d/f.txt”文件;又比如在当前目录执行find -path './*.txt'
命令,则所有的TXT文件都被找到
参考文献: [1]http://www.regular-expressions.info/posix.html [2]https://remram44.github.io/regex-cheatsheet/regex.html