无法使用 PathMatcher 和正则表达式获取文件列表

Can't get list of files using PathMatcher and regex

提问人:elads11 提问时间:12/7/2022 最后编辑:elads11 更新时间:12/7/2022 访问量:83

问:

我正在使用 PathMatcher 和 SimpleFileVisitor 遍历目录并查找仅以特定前缀开头的所有文件。但是,尽管有一些文件符合我的偏好,但我无法获得任何文件。

所需文件示例:

Prefix_some_text.csv

下面是调用 SimpleFileVisitor 类调用的 Main 代码,它使用带有前缀的正则表达式模式,并假定查找以特定模式开头的所有文件:

String directoryAsString = "C:/Users";
String pattern = "Prefix";
SearchFileByWildcard sfbw = new SearchFileByWildcard();
        try {
            List<String> actual = sfbw.searchWithWc(Paths.get(directoryAsString),pattern);
        } catch (IOException e) {
            e.printStackTrace();
        }

使用 SimpleFileVisitor 的 SearchFileByWildcard 类的实现:

static class SearchFileByWildcard {
    List<String> matchesList = new ArrayList<String>();
    List<String> searchWithWc(Path rootDir, String pattern) throws IOException {
        matchesList.clear();
        FileVisitor<Path> matcherVisitor = new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attribs) throws IOException {
                FileSystem fs = FileSystems.getDefault();
                PathMatcher matcher = fs.getPathMatcher("regex:" + pattern);
                Path name = file.getFileName(); //takes the filename from the full path
                if (matcher.matches(name)) {
                    matchesList.add(name.toString());
                }
                return FileVisitResult.CONTINUE;
            }
        };
        Files.walkFileTree(rootDir, matcherVisitor);
        return matchesList;
    }
}

我正在争论是否使用 glob 而不是正则表达式?或者也许我的正则表达式有缺陷。

Java 正则表达式 文件 匹配 通配符

评论

0赞 g00se 12/7/2022
Glob != 正则表达式模式。显然,正则表达式要强大得多。模式是什么
0赞 elads11 12/7/2022
我需要找到用户给出的具有特定模式的任何文件。在我的具体示例中,文件以 Prefix 一词开头。所以我找到了以它开头的每个文件。我想要一种通用的方式来使用它,模式将是动态的,因为有时模式可能在文件末尾?还是在中间?
0赞 g00se 12/7/2022
除非你的用户非常“技术”,否则他们不太可能用 glob 而不是正则表达式出错。当然,您也可以参数化搜索类型,默认为 glob,但正则表达式为“高级”选项
0赞 elads11 12/7/2022
如何使用 glob 的模式?我所看到的只是查找文件扩展名或特定目录模式的示例,而不仅仅是文件名。
2赞 g00se 12/7/2022
尝试glob:Prefix*

答:

2赞 atifovac 12/7/2022 #1

似乎模式是错误的。它仅匹配名为“Prefix”的文件。尝试将其更改为 .String pattern = "Prefix.*";

否则,您可以扫描名称以字符串“Prefix”开头的文件。

String name = file.getFileName().toString();
if (name.startsWith(pattern)) {
    matchesList.add(name);
}

评论

0赞 g00se 12/7/2022
它仅匹配名为“Pattern”的文件。其实不然。它仅匹配完全名为“Prefix”的路径。不过,您建议的模式是正确的
0赞 elads11 12/7/2022
只是一个更通用的想法,如果用户给出的模式是搜索以该模式结尾的文件,或者文件包含该模式怎么办?