我在文件夹中获取 .log 和 _log 之类的文件,我可以使用 /*.log$/ 选择 .log 文件,但无法找到 _log 文件。
需要一个正则表达式模式,它将从指定的文件夹中获取两种类型的文件。
您的问题被标记为“perl”和“linux”。我在这里假设您正在谈论 Perl 样式的正则表达式,因为看起来这就是您在示例代码段中显示的内容。
*.
顺序是错误的。
让我们专注于您想要匹配的内容。您想匹配以点结尾并后跟文字字符“log”的任何文件名。您还希望匹配以下划线结尾的任何文件名,后跟文字字符“log”。你真的不应该关心最后一个点或下划线之前的“任何东西”。所以正则表达式可能会更好地写成这样:
/[._]log$/
请注意,我们甚至不关心点星。在这种情况下没有帮助。
如果您希望您的模式也匹配其中文字字符“log”可以选择后跟整数序列的文件(您的问题中未提及,但在您的后续评论之一中进行了讨论),您可以这样写:
/[._]log\d*$/
这里的“星星”很有帮助;它允许零个或多个数字夹在“g”和字符串的末尾之间。
我完全同意(通过投票)DavidO 的解决方案,但使用 glob() 从特定目录获取文件列表通常更有意义,并提高可读性
my $dir = "/path/here";
my @log_files = grep { /[\._]log\d*$/ } glob("$dir/*");
print join "\n", @log_files;
这会抓住
foo.log
foo_log
foo.log1
foo_log22
使用正则表达式/.*[._]log$/
。
我很惊讶你的第一个案例有效——/*.log$/
不是合法的正则表达式(因为*
没有说明它应该匹配零个或多个)。仔细检查您当前的结果。