PathMatcher 是 Java NIO.2 提供的轻量级路径匹配工具,支持 glob 和 regex 两种模式,基于 FileSystem 创建、线程安全;glob 语法简洁常用(如 */.java),regex 更灵活但需注意转义与路径分隔符处理。

Java 中的 PathMatcher 是 NIO.2 提供的轻量级路径匹配工具,适合做文件/目录路径的规则判断(比如过滤日志、扫描资源、忽略某些路径),它不支持正则表达式,而是基于简洁的 glob 或 regex 语法,由 FileSystem 创建,线程安全,开销小。
glob 是最常用的方式,语法简单直观,适合大多数路径匹配场景;regex 更强大但需注意转义和路径分隔符处理(如 Windows 的 需双写或用正斜杠)。
**/*.java 匹配任意层级下的所有 Java 文件;config/*.properties 匹配 config 目录下一级的 properties 文件regex:^.*\.xml$(注意开头的 regex: 前缀);Windows 路径建议统一用 / 或 Pattern.quote() 处理分隔符FileSystems.getDefault().getPathMatcher("glob:**/*.log")
glob 不是正则,它的符号含义固定且有限:
*:匹配当前目录下任意**不含**路径分隔符的文件名(如 *.txt → a.txt,但不匹配 sub/a.txt)**:匹配**跨目录层级**的任意路径(如 **/*.md → README.md、docs/api.md、src/test/notes.md)?:匹配任意单个字符(不含分隔符,如 ?.log → a.log,但不匹配 ab.log)[abc] 或 [a-z]:匹配方括号内任一字符(类似正则字符类).、- 等)直接匹配,无需转义(.java 就是匹配字面量点+java)结合 Files.walk() 和 PathMatcher 可高效筛选路径:
立即学习“Java免费学习笔记(深入)”;
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**/{*.java,*.xml}");
try (Stream<Path> stream = Files.walk(Paths.get("src"))) {
stream.filter(matcher::matches)
.forEach(System.out::println);
}{a,b} 是 glob 的“组匹配”扩展(JDK 7+ 支持),表示“a 或 b”,不是所有 FileSystem 都支持,推荐优先用多个 matcher 或逻辑 ormatcher.matches(path) 时,path 应为相对路径或与 pattern 语义一致(例如 pattern 是 **/*.log,传入 Paths.get("a/b/c.log") 没问题;若 pattern 是 logs/*.log,就应确保 path 是相对于 logs 的,或改用绝对路径 + 更宽泛 pattern)regex:(?i).*.java
用错 pattern 或忽略环境细节容易导致匹配失败:
** 必须单独成段(如 foo/**/bar 合法,foo**bar 非法) 在字符串里要写成 \,但更稳妥的是全部用正斜杠 /(NIO 接口内部自动适配)PathMatcher 不解析符号链接,匹配的是路径字符串本身,不是真实文件属性/ 开头(如 /home/**/*.txt),它会尝试匹配绝对路径;一般建议 pattern 不带根,靠输入 path 控制范围基本上就这些。PathMatcher 不复杂但容易忽略语义边界,用好 glob 规则比硬套正则更稳更快。
以上就是Java里如何使用PathMatcher完成路径模式匹配_Java文件匹配规则解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号