正则表达式文件名排除匹配项



我已经在 SO 上看到了其他帖子,用于正则表达式匹配,不包括字符串(使用负值向前看/向后看),但我仍然很难让它工作。希望有人能帮忙。

我有一个正则表达式

.(gif|jpg|png)$

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

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

例如

  • 匹配任何 http://example.com/images/filename.jpg/GIF/PNG
  • 除了 (http://example.com/images/foo.jpg, http://example.com/images/foo.gif, http://example.com/images/foo.png) (http://example.com/images/bar.jpg, http://example.com/images/bar.gif, http://example.com/images/bar.png)

非常感谢!

如果排除项的数量较少,则可以使用多个负面后视,如下所示:

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

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

后视的一个缺点是你只能使用定义的长度,所以不允许*+{1,5}。您必须单独指定每个异常。

请注意,环顾四周不会改变查看它的字符串中的"位置",这就是为什么您可以像这样连接它们的原因。

您可以使用:

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

看到它

我发现尝试在 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 命令串在一起的方式。

最新更新