2014-11-22 74 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 
相關問題