提问人:elads11 提问时间:12/7/2022 最后编辑:elads11 更新时间:12/7/2022 访问量:83
无法使用 PathMatcher 和正则表达式获取文件列表
Can't get list of files using PathMatcher and regex
问:
我正在使用 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 而不是正则表达式?或者也许我的正则表达式有缺陷。
答:
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
只是一个更通用的想法,如果用户给出的模式是搜索以该模式结尾的文件,或者文件包含该模式怎么办?
评论
glob:Prefix*