我知道正则表达式只能用于字符和字符串,但有时我在文件名中发现它们。我的问题是:正则表达式仅有的与字符一起使用还是也与文件名一起使用?
答案1
正则表达式和文件名通配是两个非常不同的东西。
正则表达式用于命令/函数中文本的模式匹配。例如,的模式参数中grep
,或在编程语言中。
文件名通配符由 shell 使用,用于使用通配符匹配文件和目录名称。通配符的功能取决于 shell。例如,Bash 支持以下通配符:
*
匹配 0 个或更多字符?
匹配 1 个字符[...]
匹配指定集合中的字符
这些通配符可能看起来与正则表达式相似,实际上[...]
在通配符和正则表达式中具有相同的含义。但是*
和?
在通配符和正则表达式中的含义不同。
您在评论中写道:
但是解释器如何区分*它是小丑还是正则表达式?例如:
grep a*b a*.txt
?
简单,有点儿像。
首先,shell 会尝试解释通配符,方法是将它们与文件名进行匹配。如果有以“a”开头并以“b”结尾的文件,shell 将替换a*b
为匹配的文件名。对于 也是如此。如果没有匹配的文件名,shell将按原样a*.txt
将参数传递给。grep
但是,的第一个参数grep
应该是一个模式。在 99.999% 的实际用例中,您不希望 shell 解释第一个参数。因此,最可能的意图是:
grep "a*b" a*.txt
由于引用了a*b
,shell 不会使用通配符来解释它,而是直接将其传递给grep
。反过来,grep
会将其解释为正则表达式(根据设计)。
总结一下,shell 按照自己的通配符语言(即使用通配符)解释命令行。命令、程序按照作者设计的方式解释其参数。
答案2
如果文件名对您来说是字符串,您也可以对文件名使用正则表达式。例如:如果您想查找与正则表达式匹配的文件名,您可以尝试:
find ./ -regex '.*[abc][xyz].*'
该命令查找名称中包含 a、b 或 c 且后跟 x、y 或 z 的文件。这只是一个例子。还有无数种可能。