【问题标题】:Filter subdirectories based on regex in javajava中基于正则表达式过滤子目录
【发布时间】:2021-11-01 00:09:24
【问题描述】:

我的目录结构如下:

/test_directory/data/date=2021-01-01/
/test_directory/data/date=2021-01-02/
/test_directory/data/date=2021-01-03/
/test_directory/data/sample=2021-01-04/
/test_directory/data/sample=2021-01-05/

我只想过滤日期文件夹。

/test_directory/data/date=2021-01-01/
/test_directory/data/date=2021-01-02/
/test_directory/data/date=2021-01-03/

我厌倦了下面的代码:但无法将正则表达式保留在目录路径中。

String dir = "/test_directory/data/";
File[] directories = new File(dir).listFiles(File::isDirectory);
for(int i=0;i< directories.length;i++){
    System.out.println(directories[i]);
}

【问题讨论】:

  • 必须是正则表达式吗?否则你可以简单地做类似directory.getName().startsWith("date")的事情。
  • 但它返回的是布尔值。
  • 我之前给出的例子并不是一个完整的解决方案,因为它只是一个评论,而不是一个答案。现在,回到我的问题:它必须是正则表达式吗?
  • 只需要正则表达式即可。

标签: java regex java-8 java-io


【解决方案1】:

首先,让我们迁移到nio API,它旨在替换自Java 1.7 以来的File API。

String dir = "/test_directory/data/";
Files.list(Paths.get(dir))
    .filter(Files::isDirectory)
    .forEach(directory -> {
        System.out.println(directory.toString());
    };

此时,由于您有一个Stream,您可以轻松添加一个额外的过滤器。这可以是基于正则表达式的,也可以只是一个简单的String.startsWith

String dir = "/test_directory/data/";
Files.list(Paths.get(dir))
    .filter(Files::isDirectory)
    .filter(directory -> directory.getFileName().toString().startsWith("date"))
    .forEach(directory -> {
        System.out.println(directory.toString());
    };

使用File API,你不能有多个过滤器,所以你必须自己组合。

String dir = "/test_directory/data/";
File[] directories = new File(dir).listFiles(
    directory -> directory.isDirectory()
 && directory.getName().startsWith("date"));
for (File directory : directories) {
    System.out.println(directory.getPath());
}

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2018-10-29
    • 2011-05-14
    相关资源
    最近更新 更多