2012-09-06 79 views
1

我有我需要修改的字符串ArrayList。當我將它們添加到列表中時,它們看起來像這樣。ReplaceAll()替換錯誤的子字符串

tick.add("CAST.ST"); 
tick.add("ELUX-B.ST"); 
tick.add("EKTA-B.ST"); 

我接下來要修改名稱以去除「.ST」,並添加「.XML」

private static void addFileNames(List<String> ticks, List<File> fileNames) 
    { 
     List<String> tick = new ArrayList<String>(); 
     for(int i=0; i<ticks.size(); i++) 
      { 
      tick.add(ticks.get(i).replaceAll(".ST", ".xml")); 

      } 
     for(int i=0; i<tick.size(); i++) 
     { 
      File f = new File("XML/" + tick.get(i)); 
      fileNames.add(f); 

     } 

這完全適用於所有的字符串,除了‘CAST.ST’,它獲取的方法修改爲「C.xml.xml」。 我也試過replaceFirst,然後它將子串「AST」替換爲「C.xml.ST」。

有人可以看到我在這裏做錯了嗎?

+2

你嘗試'的replaceAll(「\ ST」,」 .XML「)'?您目前正在匹配任何字符,然後是ST,這就是爲什麼你得到你得到的結果 – vainolo

+0

謝謝,我不得不寫\t tick.add(ticks.get(i).replaceAll(「\\。ST。」,「。 XML「)); – ZedIsDead

回答

2

你需要躲避.\.,在正則表達式的一段意味着匹配任何字符。在"CAST.ST"的情況下,發佈的正則表達式將匹配"AST"".ST"

變化:

tick.add(ticks.get(i).replaceAll(".ST", ".xml")); 

到:

tick.add(ticks.get(i).replaceAll("\\.ST", ".xml")); 
+0

謝謝,我怎麼不得不用兩個反斜槓來逃跑,而你似乎只需要一個? \t tick.add(ticks.get(i).replaceAll(「\\。ST」,「.xml」)); – ZedIsDead

+0

@ZedIsDead,你還需要在字符串文字中跳過反斜槓,因此也就是兩個。 – hmjd

+0

謝謝@hmjd – ZedIsDead

0

的問題。代表正則表達式中的任何字符。用「\ .ST」退出該點。

0

replaceAll()接受RegEx表達式作爲第一個參數。

爲什麼你不使用replace(".ST", ".xml"),因爲你只想從你的原始值中取代一個值。

無需使用正則表達式這個答案

0

由於需要更換最後出現替換文件的擴展名,您可以使用

ticks.get(i).replaceAll("\\.st$", ".xml")