5

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

但是,在我使用的 sftp 客户端中,还有这个函数:lsFiles(String pattern),它返回任何与模式匹配的内容。我想使用这个函数来获取我想要的文件名,因为这会缩短和优化我的代码。问题是,我不知道如何制作一个只匹配没有给定模式(或者如果这甚至可能)的东西的正则表达式。有人可以告诉我这是否可行,如果可以,请举例说明如何执行此操作?

4

3 回答 3

4

肯定的,老板

/(?!_PROCESSED)/

这是一个负面的前瞻性,几乎所有正则表达式风格都支持它

于 2013-07-26T14:38:09.963 回答
0

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

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

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

于 2013-07-26T15:00:27.923 回答
0

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

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

[^_]++ 正如您所看到的,它使用(all that is not a _)_(?!PROCESSED) ( _not follow by PROCESSED)之间的交替。

这种模式的好处是,如果没有_PROCESSED某个地方,您可以避免逐个字符地检查,而只有当您遇到要排除的字符串的第一个字符时。因此,测试数量大大减少。

naomik 建议的功能似乎适合您尝试做的事情:

listFilesMatching(new File("/some/path", "^(?>[^_]++|_(?!PROCESSED))+$");
于 2013-07-26T16:19:08.680 回答