是否可以创建一个可以找到与模式不匹配的字符串的正则表达式?

时间:2013-07-26 14:35:16

标签: java regex

我遇到这种情况,我需要使用预建的SFTP客户端从服务器中提取一堆zipfiles。我只想要文件名中没有_PROCESSED的那些。例如,covers.zip可以,但covers_PROCESSED.zip不会。我有一个当前工作的解决方案,我运行lsFiles(),它返回目录中的所有文件名,然后运行一个函数,根据它们的文件名中是否有该关键字来过滤它们。然后从服务器中取出它们。

但是,在我正在使用的sftp客户端中,还有这个函数:lsFiles(String pattern),它返回与模式匹配的任何内容。我想使用这个函数只获取我想要的文件名,因为这会缩短和优化我的代码。问题是,我不知道如何制作只能匹配事物的正则表达式,如果它们没有给定的模式(或者如果这是可能的话)。有人可以告诉我这是否可行,如果可以的话,提供一个如何做到这一点的例子?

3 个答案:

答案 0 :(得分:3)

当然,老板

/(?!_PROCESSED)/

这是negative lookahead,几乎所有正则表达式都支持


我已经调整了this question的答案,以进一步为您提供帮助。

public static File[] listFilesMatching(File root, String regex) {
    if(!root.isDirectory()) {
        throw new IllegalArgumentException(root+" is not directory.");
    }
    final Pattern p = Pattern.compile(regex); // careful: could also throw an exception!
    return root.listFiles(new FileFilter(){
        @Override
        public boolean accept(File file) {
            return p.matcher(file.getName()).matches();
        }
    });
}

listFilesMatching(new File("/some/path"), "(?!_PROCESSED)")

以下是FileFilter

的文档

答案 1 :(得分:0)

如果您的客户端使用真正的正则表达式进行过滤,那么

lsFiles("(?!_PROCESSED)\.zip") 

应返回未处理的所有zip个文件。但通常文件过滤器只允许简单的通配符替换(*.zip种类),所以如果这实际上有效,我会感到惊讶。如果没有,那么列出所有.zip文件并过滤它们是正确的方法 - 但你已经知道了。

答案 2 :(得分:0)

您可以使用这种模式排除特定子字符串:

^(?>[^_]++|_(?!PROCESSED))+$

正如您所看到的,它使用[^_]++ (所有不是__(?!PROCESSED) 之间的交替({{1} }后面没有_

这种模式的兴趣在于,如果某个地方没有PROCESSED,您可以避免逐个字符检查,但只有当您遇到要排除的字符串的第一个字符时才能检查。因此,测试数量大大减少。

naomik建议的功能似乎适合你要做的事情:

_PROCESSED