如何独立拆分路径平台?

2022-09-02 02:24:25

我使用以下代码从给定路径获取包含所有子目录的数组。

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

我需要数组来检查某些文件夹是否位于此路径中的正确位置。这看起来是一个很好的解决方案,直到findBugs抱怨File.separator被用作正则表达式。似乎将windows文件分隔符传递给从它构建正则表达式的函数是一个坏主意,因为反斜杠是一个转义字符。

如何在不使用File.separator的情况下以跨平台方式拆分路径?或者这样的代码可以吗?

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

答案 1

文本化模式字符串

每当您需要对任意值进行字面化以用作正则表达式模式时,请使用 Pattern.quoteString

从 API:

public static String quote(String s)

返回指定 的文本模式。此方法生成一个,该方法可用于创建与字符串匹配的字符串,就好像它是文本模式一样。输入序列中的元字符或转义序列将不具有特殊含义。StringStringStringPatterns

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

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

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

文本化替换字符串

如果需要对任意替换进行字面化,请使用 Matcher.quoteReplacementString

从 API:

public static String quoteReplacement(String s)

返回指定 的文本替换。此方法生成一个,它将在类的方法中用作文本替换。生成的将与被视为文本序列的字符序列匹配。斜杠 () 和美元符号 () 将没有特殊含义。StringStringStringsappendReplacementMatcherStrings'\''$'

参数:- 要文本化的
字符串 返回:文本字符串替换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"

答案 2

重复使用以获取路径的所有组件。path.getParentFile()

不鼓励的方法是path.replaceAll(“\\”, “/”).split(“/”)