2014-11-22 84 views
3

如何将包围<>的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; 
} 
+0

需要引用(Pattern.quote)的replaceAll的第一个参数,因为它是一个正则表达式。 – 2014-11-22 13:17:55

+0

看看这个帖子http://stackoverflow.com/questions/18875852/why-string-replaceall-in-java-requires-4-slashes-in-regex-to-actually-r/ – gashu 2014-11-22 13:38:45

回答

4

你不需要replaceAll方法,因为你不使用正则表达式。相反,你可以用replace API像下面的工作:

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

没错。 'replaceAll'中的'all'并不意味着它代替了所有搜索到的字符串,而'replace'代替了第一个。它们都替换*所有*事件。 – Tom 2014-11-22 13:23:58

+0

谢谢。他们选择了一些令人困惑的名字:) – clankill3r 2014-11-26 17:44:23

0

由于replaceAll作品与正则表达式,你需要重新逃避反斜杠:

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


报价this答案:

到正则表达式编译器看到你给出的模式时,它只看到一个反斜杠( )因为Java的词法分析器已经转向双 backwhack到一个单一的一个)

3

StringreplaceAll使用正则表达式,如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