我在文件夹中获取.log和_log等文件,我可以使用/*.log$/选择.log文件,但无法找到_log文件。
需要一个正则表达式模式,它将从指定文件夹中获取两种类型的文件。
答案 0 :(得分:3)
你的问题被标记为'perl'和'linux'。我在这里假设您正在谈论Perl样式的正则表达式,因为它看起来就像您在示例代码段中显示的那样。
*.
序列是错误的。
让我们专注于您想要匹配的内容。您希望匹配以点结尾的任何文件名,后跟文字字符“log”。您还希望匹配以下划线结尾的任何文件名,后跟文字字符“log”。你真的不应该关注最后一点或下划线之前可能出现的“任何事物”。所以regexp可能会更好地写成:
/[._]log$/
请注意,我们甚至不打扰点星。在这种情况下没有用。
如果你想让你的模式也匹配文字,其中文字字符'log'可以选择后跟一个整数序列(在你的问题中没有提到,但在你的一个后续评论中讨论过),你可以把它写成这样:
/[._]log\d*$/
这里'star' 有帮助;它允许夹在“g”和字符串末尾之间的零个或多个数字。
答案 1 :(得分:1)
我完全同意(通过upvoting)与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
答案 2 :(得分:-1)
使用正则表达式/.*[._]log$/
。
我对你的第一个案例工作感到惊讶 - /*.log$/
不是合法的正则表达式(因为*
没有说它应该匹配零的 - 或更多)。仔细检查您当前的结果。