如何独立分割路径平台?

Jan*_*usz 17 java regex cross-platform file

我正在使用以下代码来获取包含给定路径中所有子目录的数组.

String[] subDirs = path.split(File.separator); 
Run Code Online (Sandbox Code Playgroud)

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

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

String[] subDirs = path.split("/"); 
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 38

文字化模式字符串

每当您需要将任意字面值String用作正则表达式模式时,请使用Pattern.quote:

来自API:

public static String quote(String s)

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

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

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

String[] subDirs = path.split(Pattern.quote(File.separator));
Run Code Online (Sandbox Code Playgroud)

文字化替换字符串

如果您需要对任意替换进行文字化String,请使用Matcher.quoteReplacement.

来自API:

public static String quoteReplacement(String s)

返回String指定的文字替换String.这种方法产生一个String,将工作作为文字置换sappendReplacement所述的方法Matcher的类.该String产生了的字符序列将匹配s视为文字序列.斜杠('\')和美元符号('$')将没有特殊含义.

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

这引述更换String也是有用的String.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"
Run Code Online (Sandbox Code Playgroud)


aka*_*okd 14

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

气馁的方式是path.replaceAll("\\", "/").split("/").