我遇到这种情况,我需要使用预建的SFTP客户端从服务器中提取一堆zipfiles。我只想要文件名中没有_PROCESSED
的那些。例如,covers.zip
可以,但covers_PROCESSED.zip
不会。我有一个当前工作的解决方案,我运行lsFiles()
,它返回目录中的所有文件名,然后运行一个函数,根据它们的文件名中是否有该关键字来过滤它们。然后从服务器中取出它们。
但是,在我正在使用的sftp客户端中,还有这个函数:lsFiles(String pattern)
,它返回与模式匹配的任何内容。我想使用这个函数只获取我想要的文件名,因为这会缩短和优化我的代码。问题是,我不知道如何制作只能匹配事物的正则表达式,如果它们没有给定的模式(或者如果这是可能的话)。有人可以告诉我这是否可行,如果可以的话,提供一个如何做到这一点的例子?
答案 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