【问题标题】:String index out of range with replace all字符串索引超出范围,全部替换
【发布时间】:2014-11-22 13:15:05
【问题描述】:

如何将 包围的 mapDir 替换为某个字符串?

  String mapDir = "D:\\mapping\\specialists\\ts_gpc\\";
  String test = "foo: <mapDir> -bar";
  println(test.replaceAll("<mapDir>", mapDir));

上面给了我一个 StringIndexOutOfBoundsException。

下面这段代码适合我,但我认为纯 java 也必须工作。

static String replaceWord(String original, String find, String replacement) {
    int i = original.indexOf(find);
    if (i < 0) {
        return original;  // return original if 'find' is not in it.
    }

    String partBefore = original.substring(0, i);
    String partAfter  = original.substring(i + find.length());

    return partBefore + replacement + partAfter;
}

【问题讨论】:

标签: java replace


【解决方案1】:

您不需要 replaceAll 方法,因为您没有使用正则表达式。相反,您可以使用replace api,如下所示:

String mapDir = "D:\\mapping\\specialists\\ts_gpc\\";
String test = "foo: <mapDir> -bar";
System.out.println(test.replace("<mapDir>", mapDir));

【讨论】:

  • 没错。 replaceAll 中的 all 并不意味着它会替换所有出现的搜索字符串,而 replace 仅替换第一个。它们都替换了所有次。
【解决方案2】:

String 中的replaceAll 使用正则表达式,如documentation 中所指定:

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

因此,您应该像这样转义替换字符串:

String mapDir = "D:\\mapping\\specialists\\ts_gpc\\";
String test = "foo: <mapDir> -bar";
System.out.println(test.replaceAll("<mapDir>", Matcher.quoteReplacement(mapDir)));

给出输出:

foo: D:\mapping\specialists\ts_gpc\ -bar

【讨论】:

    【解决方案3】:

    由于replaceAll 与正则表达式一起使用,您需要重新转义反斜杠:

    String mapDir = "D:\\\\mapping\\\\specialists\\\\ts_gpc\\\\";
    String test = "foo: <mapDir> -bar";
    System.out.println(test.replaceAll("<mapDir>", mapDir));
    


    引用this答案:

    当正则表达式编译器看到你给它的模式时,它 只看到一个反斜杠(因为 Java 的词法分析器已经把双 倒退成一个)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 2012-03-02
      • 2016-02-10
      • 2021-01-30
      相关资源
      最近更新 更多