You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:20:29