【问题标题】:Java - replace all instances of path separators with system path separatorJava - 用系统路径分隔符替换路径分隔符的所有实例
【发布时间】:2013-07-23 23:29:13
【问题描述】:

我已经从这个答案中获取了匹配斜杠和反斜杠的正则表达式:Regex to match both slash in JAVA

    String path = "C:\\system/properties\\\\all//";
    String replaced = path.replaceAll("[/\\\\]+", 
        System.getProperty("file.separator"));

但是,我得到了错误:

线程“主”java.lang.StringIndexOutOfBoundsException 中的异常: 字符串索引超出范围:1

这个正则表达式有什么问题?删除+ 不会改变任何东西,错误信息是一样的...

【问题讨论】:

标签: java regex


【解决方案1】:

记录在the Javadoc:

请注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同;见Matcher.replaceAll。如果需要,请使用 Matcher.quoteReplacement(java.lang.String) 隐藏这些字符的特殊含义。

所以你可以试试这个:

String replaced = path.replaceAll("[/\\\\]+", Matcher.quoteReplacement(System.
            getProperty("file.separator")));

【讨论】:

    【解决方案2】:

    这应该有效:

    String path = "C:\\system/properties\\\\all//";
    

    编辑:修改了 assylias 回答的以下内容

    System.out.println(path.replaceAll("(\\\\+|/+)", Matcher.quoteReplacement(System.getProperty("file.separator"))));
    

    编辑结束

    输出(对我来说 - 我使用的是 mac):

    C:/system/properties/all/
    

    因此它将“规范化”双分隔符。

    【讨论】:

    • 由于反斜杠字符,您将在 Windows 上遇到此问题
    • @Reimeus 怎么来的?这在输出中有一个正斜杠,因为我使用的是 mac,但在 Windows 中它会输出一个反斜杠——这就是 System 属性的全部意义。还是我误会了你?
    • 问题不在于正则表达式,而在于替换 String,请参阅 assylias 答案
    • @Reimeus 哦...对!现在明白了:D 编辑我的答案。谢谢!
    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2011-06-03
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多