在 Linux 中,
?
只能匹配一个字符。但在 DOS/Windows 中,如果
?
处于末尾或者
.
的前面,它也可以匹配零个字符。例如在 DOS/Windows 中,
abc?.*
可以匹配
abc.html
,
abcd.md
这样的文件名。
在 DOS/Windows 中,
?
不能匹配文件名中的
.
。比如
abc?md
不能匹配
abc.md
。
在 Linux 中,如果
.
在文件名的开头,不能用
*
或
?
来匹配。
另外,以
.
开头的文件名在 Linux 中很普遍,但在 DOS/Windows 中就很另类,会产生些问题。不提了,不提了,都是坑。
在命令行中,通配符是占位符,可以独立使用,跟前面的字符没关系。比如
abc*
,表示一个字符串以
abc
开始,然后跟 0 个或多个任意字符。
在正则表达式中,
*
和
?
是对前面的表达式进行匹配次数限制,不能独立使用的。比如
abc*
,表示字符串中包含
ab
,后面跟上 0 个或多个
c
。这个表达式可以匹配
ab
,
abc
,
abcc
,
abcccd
这样的字符串。这里的
*
作用在它前面的
c
上(如果想作用于它前面的
abc
,要写成
(abc)*
)。
举两个例子:
用于命令行文件名匹配时,可以匹配只有一个字符的名字:
t
,
x
等;
用于正则表达式中字符串匹配时,它是无效表达式。
两者之间还是有些联系的,纯粹靠区别还不足以把人搞凌乱。