Java 字符串索引超出范围,替换为全部

Java 字符串索引超出范围,替换为全部,java,replace,Java,Replace,如何将mapDir替换为某个字符串 String mapDir = "D:\\mapping\\specialists\\ts_gpc\\"; String test = "foo: <mapDir> -bar"; println(test.replaceAll("<mapDir>", mapDir)); String mapDir=“D:\\mapping\\experties\\ts\u gpc\\”; 字符串测试=“foo:-bar”; println

如何将mapDir替换为某个字符串

  String mapDir = "D:\\mapping\\specialists\\ts_gpc\\";
  String test = "foo: <mapDir> -bar";
  println(test.replaceAll("<mapDir>", mapDir));
String mapDir=“D:\\mapping\\experties\\ts\u gpc\\”;
字符串测试=“foo:-bar”;
println(test.replaceAll(“,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;
}
静态字符串替换字(字符串原始、字符串查找、字符串替换){
int i=原始索引(find);
if(i<0){
return original;//如果“find”不在其中,则返回original。
}
String partBefore=original.substring(0,i);
String partAfter=original.substring(i+find.length());
退货前+更换后+零件后;
}

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

String mapDir = "D:\\mapping\\specialists\\ts_gpc\\";
String test = "foo: <mapDir> -bar";
System.out.println(test.replace("<mapDir>", mapDir));
String mapDir=“D:\\mapping\\experties\\ts\u gpc\\”;
字符串测试=“foo:-bar”;
System.out.println(test.replace(“,mapDir));
由于使用正则表达式,因此需要重新转义反斜杠:

String mapDir = "D:\\\\mapping\\\\specialists\\\\ts_gpc\\\\";
String test = "foo: <mapDir> -bar";
System.out.println(test.replaceAll("<mapDir>", mapDir));
String mapDir=“D:\\\\mapping\\\\\experties\\\\ts\u gpc\\\”;
字符串测试=“foo:-bar”;
System.out.println(test.replaceAll(“,mapDir));

引述答覆:

当正则表达式编译器看到您给定的模式时,它将 只看到一个反斜杠(因为Java的lexer已将 回击成单个)


String
中的
replaceAll
使用正则表达式,如下所示:

请注意,替换字符串中的反斜杠()和美元符号($)可能会导致结果不同于将其视为文字替换字符串时的结果;见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)));

您需要引用replaceAll的第一个参数(Pattern.quote),因为它是一个正则表达式。请仔细阅读本文。
replaceAll
中的
all
并不意味着它将替换搜索字符串的所有匹配项,而
replace
仅替换第一个匹配项。它们都替换所有引用。
foo: D:\mapping\specialists\ts_gpc\ -bar