0

0

Java里如何使用PathMatcher完成路径模式匹配_Java文件匹配规则解析

P粉602998670

P粉602998670

发布时间:2025-12-23 13:22:02

|

775人浏览过

|

来源于php中文网

原创

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

java里如何使用pathmatcher完成路径模式匹配_java文件匹配规则解析

Java 中的 PathMatcher 是 NIO.2 提供的轻量级路径匹配工具,适合做文件/目录路径的规则判断(比如过滤日志、扫描资源、忽略某些路径),它不支持正则表达式,而是基于简洁的 glob 或 regex 语法,由 FileSystem 创建,线程安全,开销小。

一、PathMatcher 的两种模式:glob 和 regex

glob 是最常用的方式,语法简单直观,适合大多数路径匹配场景;regex 更强大但需注意转义和路径分隔符处理(如 Windows 的 \ 需双写或用正斜杠)。

  • glob 示例:**/*.java 匹配任意层级下的所有 Java 文件;config/*.properties 匹配 config 目录下一级的 properties 文件
  • regex 示例:regex:^.*\\.xml$(注意开头的 regex: 前缀);Windows 路径建议统一用 /Pattern.quote() 处理分隔符
  • 创建方式:FileSystems.getDefault().getPathMatcher("glob:**/*.log")

二、glob 通配符规则详解

glob 不是正则,它的符号含义固定且有限:

  • *:匹配当前目录下任意**不含**路径分隔符的文件名(如 *.txta.txt,但不匹配 sub/a.txt
  • **:匹配**跨目录层级**的任意路径(如 **/*.mdREADME.mddocs/api.mdsrc/test/notes.md
  • ?:匹配任意单个字符(不含分隔符,如 ?.loga.log,但不匹配 ab.log
  • [abc][a-z]:匹配方括号内任一字符(类似正则字符类)
  • 字面量字符(包括 .- 等)直接匹配,无需转义(.java 就是匹配字面量点+java

三、实际使用示例:遍历并过滤文件

结合 Files.walk()PathMatcher 可高效筛选路径:

造次
造次

Liblib打造的AI原创IP视频创作社区

下载

立即学习Java免费学习笔记(深入)”;

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**/{*.java,*.xml}");
try (Stream stream = Files.walk(Paths.get("src"))) {
    stream.filter(matcher::matches)
          .forEach(System.out::println);
}
  • 注意:{a,b} 是 glob 的“组匹配”扩展(JDK 7+ 支持),表示“a 或 b”,不是所有 FileSystem 都支持,推荐优先用多个 matcher 或逻辑 or
  • 路径传入 matcher.matches(path) 时,path 应为相对路径或与 pattern 语义一致(例如 pattern 是 **/*.log,传入 Paths.get("a/b/c.log") 没问题;若 pattern 是 logs/*.log,就应确保 path 是相对于 logs 的,或改用绝对路径 + 更宽泛 pattern)
  • 大小写敏感性取决于底层文件系统(Linux 默认敏感,Windows 默认不敏感),如需强制不敏感,可用 regex:(?i).*\.java

四、常见坑与注意事项

用错 pattern 或忽略环境细节容易导致匹配失败:

  • ** 必须单独成段(如 foo/**/bar 合法,foo**bar 非法)
  • Windows 路径中反斜杠 \ 在字符串里要写成 \\,但更稳妥的是全部用正斜杠 /(NIO 接口内部自动适配)
  • PathMatcher 不解析符号链接,匹配的是路径字符串本身,不是真实文件属性
  • 如果 pattern 以 / 开头(如 /home/**/*.txt),它会尝试匹配绝对路径;一般建议 pattern 不带根,靠输入 path 控制范围

基本上就这些。PathMatcher 不复杂但容易忽略语义边界,用好 glob 规则比硬套正则更稳更快。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

837

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

741

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

736

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

399

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.4万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号