regex 如何拆分路径平台无关?

bxfogqkk  于 2023-03-04  发布在  其他
关注(0)|答案(6)|浏览(134)

我使用下面的代码获取一个数组,其中包含给定路径的所有子目录。

String[] subDirs = path.split(File.separator);

我需要这个数组来检查某些文件夹是否在这个路径中的正确位置。这看起来是一个很好的解决方案,直到findBugs抱怨File.separator被用作正则表达式。似乎将windows文件分隔符传递给一个从它构建正则表达式的函数是一个坏主意,因为反斜杠是一个转义字符。
我怎样才能不使用文件分隔符而以跨平台的方式分割路径呢?或者这样的代码可以吗?

String[] subDirs = path.split("/");
ltqd579y

ltqd579y1#

正在初始化模式字符串

当你需要将一个任意的String转换为正则表达式模式时,可以使用Pattern.quote
来自API:
public static String quote(String s)
返回指定String的文本模式String。此方法生成一个String,可用于创建Pattern,该Pattern将与字符串s匹配,就像字符串s是文本模式一样。输入序列中的元字符或转义序列将没有特殊含义。

    • 参数:**s-要进行文本化的字符串
    • 返回:**文字字符串替换

这意味着您可以执行以下操作:

String[] subDirs = path.split(Pattern.quote(File.separator));

正在初始化替换字符串

如果需要对任意替换String进行文本化,请使用Matcher.quoteReplacement
来自API:
x1米11米1x
返回指定String的文本替换String。此方法生成String,它将用作Matcher类的appendReplacement方法中的文本替换s。生成的String将与被视为文本序列的s中的字符序列匹配。斜线('\')和美元符号('$')将不被赋予特殊含义。

    • 参数:**s-要进行文本化的字符串
    • 返回:**文字字符串替换

此引用的替换StringString.replaceFirstString.replaceAll中也很有用:
请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同。如果需要,请使用Matcher.quoteReplacement取消显示这些字符的特殊含义。

示例

System.out.println(
        "O.M.G.".replaceAll(".", "!")
    ); // prints "!!!!!!"

    System.out.println(
        "O.M.G.".replaceAll(Pattern.quote("."), "!")
    ); // prints "O!M!G!"

    System.out.println(
        "Microsoft software".replaceAll("so", "$0")
    ); // prints "Microsoft software"

    System.out.println(
        "Microsoft software".replaceAll("so", Matcher.quoteReplacement("$0"))
    ); // prints "Micro$0ft $0ftware"
xam8gpfp

xam8gpfp2#

重复使用path.getParentFile()以获取路径的所有组件。
不太好的办法是去path.replaceAll("\\", "/").split("/")

sc4hvdpw

sc4hvdpw3#

创建一个空列表,并使用forEach迭代path元素,将每个元素插入列表中以供以后用途:

List<String> pathElements = new ArrayList<>();
Paths.get("/foo/bar/blah/baz").forEach(p -> pathElements.add(p.toString()))

此外,如果需要特定的路径元素,请用途:

<pathObject>.getName(<intIndex>).toString()

其中<pathObject>由对Paths.get()的调用返回,如果需要在字符串中返回路径的多个部分,请用途:

<pathObject>.subPath(<intStart>, <intEnd>).toString()

您可以使用以下公式获得路径元素的总数(用于<intEnd>):

<pathObject>.getNameCount()

在Java PathPaths文档页中还有其他有用的方法。

ui7jx7zq

ui7jx7zq4#

java.nio.file.Path实现了Iterable<Path>,因此您可以执行以下操作:

public static void showElements(Path p) {
    List<String> nameElements = new ArrayList<>();
    for (Path nameElement: p)
        nameElements.add(nameElement.toFile().getName());
    System.out.printf("For this file: [%s], the following elements were found: [%s]\n"
                      , p.toAbsolutePath()
                      , Joiner.on(", ").join(nameElements));
}

方法getNameCount和getName可以用于类似的目的。

x6h2sr28

x6h2sr285#

您可以使用Path界面:

Path p = Paths.get(pathStr);
for (int i = 0; i < p.getNameCount(); i++) {
    String name = p.getName(i).toString();
    //do what you need with name;
}
bihw5rsg

bihw5rsg6#

怎么样

String[] subDirs = path.split(File.separator.replaceAll("\\", "\\\\"));

相关问题