gpt4 book ai didi

Java PathMatcher 在 Windows 上无法正常工作

转载 作者:行者123 更新时间:2023-12-04 14:11:15 26 4
gpt4 key购买 nike

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

import java.nio.file.FileSystems;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;

public class TestApp{

public static void main(String []args){
final PathMatcher glob = FileSystems.getDefault().getPathMatcher("glob:{/,/test}");
final PathMatcher regex = FileSystems.getDefault().getPathMatcher("regex:/|/test");

System.err.println(glob.matches(Paths.get("/"))); // --> Linux=true Windows=true
System.err.println(glob.matches(Paths.get("/test"))); // --> Linux=true Windows=true
System.err.println(glob.matches(Paths.get("/test2"))); // --> Linux=false Windows=false

System.err.println(regex.matches(Paths.get("/"))); // --> Linux=true Windows=false
System.err.println(regex.matches(Paths.get("/test"))); // --> Linux=true Windows=false
System.err.println(regex.matches(Paths.get("/test2"))); // --> Linux=false Windows=false
}
}

但是我的正则表达式中有一个更长的列表,用于多个文件,这些文件不容易迁移到 glob 语法。否则,如果我将每个模式都写为未分组模式,我会嵌套不允许的组或更长的列表。

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

最佳答案

首先我想说这是 PathMatcher 的 glob 处理语法中未记录的行为。它似乎将反斜杠(在 Windows 文件系统上很常见)转换为正斜杠(反之亦然)。从而使其始终在 Linux 和 Windows 之间工作。

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

System.out.println(Paths.get("/test")); // Will output '\test' on Windows, '/test' on Linux

为了解决最初的问题,我们需要使用一些 RegexFu。

FileSystems.getDefault().getPathMatcher("regex:/|/test");

需要成为

FileSystems.getDefault().getPathMatcher("regex:(/|\\\\)|((/|\\\\)test)");
  • 第一组将检查 /\(你需要 \\ 来转义 \,但因为 Java,它需要像 \\\\ 一样输入)。
  • 第二组由两部分组成,第一部分再次在 /\ 之间进行检查,第二部分是问题中输入的文本。

感谢@user3775041 提供了更清晰的正则表达式:

FileSystems.getDefault().getPathMatcher("regex:[/\\\\]|[/\\\\]test");

这已经在 Windows 10 和 Ubuntu 20.04 上进行了测试,两者都具有以下输出:

true
true
false
true
true
false

编辑:一个用 Java 测试正则表达式模式的好网站是 https://www.regexplanet.com/advanced/java/index.html

关于Java PathMatcher 在 Windows 上无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64102053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com