Java PathMatcher在Windows上无法正常工作

Java PathMatcher在Windows上无法正常工作,java,regex,path,glob,matcher,Java,Regex,Path,Glob,Matcher,我尝试为我的SimpleFileVisitor实现JUnit测试,但使用的PathMatcher在Windows上无法正常工作。问题似乎是带有正则表达式模式的PathMatcher在Linux和Windows上的行为不同: 导入java.nio.file.FileSystems; 导入java.nio.file.PathMatcher; 导入java.nio.file.path; 公共类测试{ 公共静态void main(字符串[]args){ 最终路径匹配器glob=FileSystems.g

我尝试为我的SimpleFileVisitor实现JUnit测试,但使用的PathMatcher在Windows上无法正常工作。问题似乎是带有正则表达式模式的PathMatcher在Linux和Windows上的行为不同:

导入java.nio.file.FileSystems;
导入java.nio.file.PathMatcher;
导入java.nio.file.path;
公共类测试{
公共静态void main(字符串[]args){
最终路径匹配器glob=FileSystems.getDefault().getPathMatcher(“glob:{/,/test}”);
最终路径匹配器regex=FileSystems.getDefault().getPathMatcher(“regex:/|/test”);
System.err.println(glob.matches(path.get(“/”));//-->Linux=true Windows=true
System.err.println(glob.matches(path.get(“/test”));//-->Linux=true Windows=true
System.err.println(glob.matches(path.get(“/test2”));//-->Linux=false Windows=false
System.err.println(regex.matches(path.get(“/”));//-->Linux=true Windows=false
System.err.println(regex.matches(path.get(“/test”));//-->Linux=true Windows=false
System.err.println(regex.matches(path.get(“/test2”));//-->Linux=false Windows=false
}  
}
但我的正则表达式中有一个较长的列表,用于多个文件,这些文件不容易迁移到glob语法。否则,我会嵌套不允许的组,或者如果我将每个模式都作为未分组的模式编写,则会有更长的列表


以跨平台的方式执行此操作的最佳方式是什么?

首先,我想说这是PathMatcher的全局处理语法中未记录的行为。它似乎将向后斜杠(在Windows文件系统中很常见)转换为向前斜杠(反之亦然)。因此,它总是在Linux和Windows之间工作

下一行演示了不同的输出:

System.out.println(path.get(“/test”);//将在Windows上输出“\test”,在Linux上输出“/test”
要解决最初的问题,我们需要使用一些正则表达式

FileSystems.getDefault().getPathMatcher(“regex:/|/test”);
需要成为

FileSystems.getDefault();
  • 第一组将在
    /
    \
    之间进行检查(您需要
    \
    来转义
    \
    ,但因为Java需要像
    \\\
    一样输入)
  • 第二组由两部分组成,第一部分在
    /
    \
    之间进行检查,第二部分是问题中输入的文本
感谢@user3775041提供了更简洁的正则表达式:

FileSystems.getDefault();
这已经在Windows 10和Ubuntu20.04上进行了测试,两者都有以下输出:

true
true
false
true
true
false

编辑:在Java中测试正则表达式模式的好站点是

如果您想要在Linux上运行代码时正则表达式中不包含Windows文件分隔符的版本,还可以使用:

String sep = Pattern.quote(File.separator);
PathMatcher regex = FileSystems.getDefault().getPathMatcher("regex:"+sep+"|"+sep+"test");

这将在Linux/Windows上打印相同的输出。

我可以验证此解决方案是否有效,但我的最终jar将仅在Linux/Unix上运行,因此此解决方案不是我想要的解决方案。如果有另一个Windows JRE上似乎不存在的路径实现就好了。@user3775041我同意在Java中不同文件系统之间的路径实现有点困难。这主要是因为它使用的是本机实现,不幸的是,每个文件系统的实现都不同。我们只能希望将来所有的文件系统都是一样的。顺便说一句:在我看来,
regex:[/\\\\\\]\;[/\\\\\\]test
稍微不那么难看一点。更好的是,仍然让我的代码总是在Linux代码上运行,但比
[/\\\\\\]
可读性强得多。