1

我已经看到其他关于正则表达式匹配的帖子,不包括字符串(使用否定前瞻/后视),但我仍然很难让它工作。希望有人能帮忙。

我有一个正则表达式

\.(gif|jpg|png)$

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

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

例如

非常感谢!

4

3 回答 3

2

您可以使用:

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

看见

于 2012-06-01T06:14:45.767 回答
2

如果排除的数量很少,您可以像这样使用多个否定的look-behinds:

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

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

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

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

于 2012-06-01T07:49:16.907 回答
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 命令串在一起的方式。

于 2012-06-01T06:19:26.760 回答