2012-09-06 80 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")