使用PathMatcher与正则表达式无法获取目标文件列表的问题
问题:使用PathMatcher遍历目录无法匹配前缀开头的文件
你用PathMatcher和SimpleFileVisitor遍历目录,目标是查找所有以特定前缀开头的文件(示例文件名:Prefix_some_text.csv),但实际运行时明明存在符合条件的文件,却无法获取到结果。
你的主调用代码:
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(); }
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; } }
问题原因
你的核心问题是正则表达式的写法不符合需求:当前传入的pattern是"Prefix",搭配regex:前缀时,这个正则会要求文件名完全等于Prefix,而不是以Prefix开头。正则默认是精确匹配,必须明确写出前缀匹配的规则才能生效。
两种解决方案
方案1:修正正则表达式
调整正则规则,让它匹配以指定前缀开头的文件名:
^:标记字符串的起始位置.*:匹配任意长度的任意字符(除换行符)
可以直接修改调用时的pattern:
String pattern = "^Prefix.*";
或者在工具类里自动处理,避免每次手动写正则:
// 在visitFile方法中修改PathMatcher初始化 PathMatcher matcher = fs.getPathMatcher("regex:^" + pattern + ".*");
方案2:改用Glob模式(更简洁)
Glob模式专为文件路径匹配设计,语法更直观,不需要复杂的正则符号。要匹配以Prefix开头的文件,只需在pattern后加*即可:
修改工具类中的PathMatcher初始化代码:
PathMatcher matcher = fs.getPathMatcher("glob:" + pattern + "*");
调用时保持原pattern不变:
String pattern = "Prefix";
额外说明
如果需要忽略大小写匹配:
- Glob模式:在规则前加
(?i),比如"glob:(?i)Prefix*" - 正则模式:在规则前加
(?i),比如"regex:(?i)^Prefix.*"
内容的提问来源于stack exchange,提问作者elads11
相关产品推荐
相关产品推荐

