正则表达式VS Filename遍历


15

我知道正则表达式只能与字符和字符串一起使用,但是有时我会在文件名中找到它们。我的问题是:正则表达式用于字符还是文件名?

Answers:


19

正则表达式和文件名遍历是两个非常不同的东西。

在命令/函数中使用正则表达式来进行文本模式匹配。例如,使用的pattern参数grep或使用编程语言。

外壳程序使用文件名通配符来使用通配符匹配文件名和目录名。globbing的功能取决于外壳。例如,Bash支持通配符,例如:

  • * 匹配0个或更多字符
  • ? 匹配1个字符
  • [...] 匹配指定集合中的字符

这些通配符可能看起来类似于正则表达式,[...]在通配符和正则表达式中确实具有相同的含义。但是*?在遍历和正则表达式中意味着不同的事情。

您在评论中写道:

但是口译员的区别*是小丑还是正则表达式?例如:grep a*b a*.txt

简单。有点。

首先,shell尝试通过将通配符与文件名匹配来解释通配符。如果存在以“ a”开头和以“ b”结尾的文件,则外壳程序将替换a*b为匹配的文件名。同样适用a*.txt。如果没有匹配的文件名,则外壳将按grep原样传递参数。

但是,的第一个参数grep应该是模式。在99.999%的实际用例中,您不希望外壳解释第一个参数。因此,最有可能的意图是:

grep "a*b" a*.txt

感谢引用a*b,shell不会使用globlob解释它,而是将其直接传递给grep。反过来,grep将其解释为正则表达式(通过设计)。

总结起来,shell使用通配符解释其自身的通配语言,以解释命令行。命令,程序以其作者设计的任何方式解释其参数。


4

如果文件名适合您的字符串,则也可以将正则表达式用于文件名。例如:如果要查找与正则表达式匹配的文件名,可以尝试:

find ./ -regex '.*[abc][xyz].*'

该命令查找名称中带有a,b或c后跟x,y或z的文件。这只是一个例子。有无尽的可能性。


但是口译员的区别*是小丑还是正则表达式?例如:$ grep a“ asterix” b a“ asterix” .txt
Hamza 2015年

2
如果使用,则将find ./ -name 'a*'*用作通配符。键入时find ./ -regex 'a*',可以在正则表达式中使用*。重要的区别是开关-name-regex
没人
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.