RegEx文件名排除匹配

时间:2012-06-01 06:08:34

标签: regex

我已经看到其他帖子在SO上用于RegEx匹配排除字符串(使用负面向前看/看后面)但我仍然很难让它工作。希望有人可以提供帮助。

我有一个RegEx

\.(gif|jpg|png)$

我用它匹配任何以(gif / jpg / png)结尾的文件名

但是我想使用排除列表,以便不匹配某些文件名。

例如

非常感谢!

3 个答案:

答案 0 :(得分:2)

您可以使用:

^(?!(foo|bar)\.(gif|jpg|png)$).*\.(gif|jpg|png)$

See it

答案 1 :(得分:1)

我发现在6周后尝试阅读我的代码意味着将这样的过滤器与正则表达式分开应用几乎总是更好。如果你原谅一点perl:

# Apply original png/gif/jpg filter to get list of files
my @files = qw/
    asdf.jpg
    bar.png
    fdsa.png
    foo.gif
    foo.jpg
/;

# Filter files to only those that don't look like ^<forbidden>\.
@files = grep {
    $_ !~ /^(foo|bar)\./
} @files;

特别是人们倾向于将shell命令串在一起。

答案 2 :(得分:1)

如果排除的数量很少,您可以使用多个负面的后视:

(?<!\/foo)(?<!\/bar)(?<!www\.site\.com\/foobar)\.(gif|jpg|png)$

foo和bar之前的'/'确保全名与foo或bar匹配,它不仅以foo或bar结尾。如果文件名之前没有'/',则需要调整此部分。

后视的一个缺点是您只能使用定义的长度,因此不允许*+{1,5}。您必须自己指定每个例外。

请注意,环视不会改变查看它的字符串中的“位置”,这就是为什么你可以像这样连接它们。