【问题标题】:"\\\\".replaceAll("\\\\", "\\") throws java.lang.StringIndexOutOfBoundsException"\\\\".replaceAll("\\\\", "\\") 抛出 java.lang.StringIndexOutOfBoundsException
【发布时间】:2013-01-16 23:42:14
【问题描述】:

以下Java代码片段:

"\\\\".replaceAll("\\\\", "\\");

抛出异常:

java.lang.StringIndexOutOfBoundsException: String index out of range: 1 (NO_SOURCE_FILE:0)

javadoc on replaceAll 确实包含使用反斜杠的警告,并建议使用 Matcher.replaceAllMatcher.quoteReplacement。有没有人有关于如何用单个反斜杠替换字符串中所有出现的两个反斜杠的 sn-p ?

澄清

上面显示的实际文字只是一个示例,实际字符串可以在不同的地方多次出现两个连续的反斜杠。

【问题讨论】:

    标签: java string replace str-replace


    【解决方案1】:

    您可以简单地使用String#replace():-

    "\\\\".replace("\\\\", "\\")
    

    String#replaceAllregex 作为参数。因此,您必须两次转义 backslash。一次是Java,然后是Regex。因此,使用 replaceAll 的实际替换看起来像:-

    "\\\\".replaceAll("\\\\\\\\", "\\\\")
    

    但你在这里并不需要replaceAll

    【讨论】:

    • 非常有帮助!谢谢!我不知道我必须两次转义 `\` 字符。
    【解决方案2】:

    如果你想使用Matcher.replaeAll(),那么你需要这样的东西:

    Pattern.compile("\\\\\\\\").matcher(input).replaceAll("\\\\");
    

    【讨论】:

      【解决方案3】:

      试试这个:

      "\\\\".replaceAll("\\{2}", "\\")
      

      replaceAll() 的第一个参数是正则表达式,{2} 表示必须匹配两次出现的字符。

      【讨论】:

        【解决方案4】:

        如果替换字符串中有反斜杠,它将被视为转义字符,该方法将尝试读取下一个字符。这就是为什么,它会抛出 StringIndexOutOfBoundsException。

        【讨论】:

          猜你喜欢
          • 2022-01-01
          • 2011-03-22
          • 2013-09-04
          • 1970-01-01
          • 2012-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-07
          相关资源
          最近更新 更多