2012-10-24 60 views
2

我想實現子串替換,但我沒有得到想要的結果。有人可以評論我可能在這裏錯過什麼嗎?在Java中的子串替換

public class SubtringReplacement { 

    public static void main (String[] args){ 

     String input = "xPIy"; 
     if (input.contains("PI") || input.contains("pi") || input.contains("Pi")){ 
      input.replace("PI", "3.14"); 
     } 
     System.out.println(input); 
    } 

} 

回答

8

字符串是不可改變的!

input = input.replace("PI", "3.14"); 
+1

並將其更改爲一個條件'input.toLowerCase()。contains(「pi」)' –

+0

@YogendraSingh _Strings is immutable !! _ –

+1

@JigarJoshi - 原始條件與「pI」不匹配,所以簡化是不等同。 –

2

一個問題是,當你做替換時你需要捕獲返回值。另一個問題是,你只能替換大寫"PI",而你似乎想要替換混合大小寫的情況。試試這個:

input = input.replaceAll("(PI|pi|Pi)", "3.14"); 

replace尋找文字匹配; replaceAll會執行正則表達式匹配,這正是您需要的。

順便說一句,你不需要if條件 - 如果沒有匹配,將不會有替代。

P.S.如果您還想替換"pI"的實例,請查看@NullUserException的註釋。

+0

或者你可以做'(?i)pi' – NullUserException

+0

@NullUserException - 是的,除了我只注意到OP排除「pI」,所以我更新了r.e. –

+0

謝謝,我正在嘗試使用.matches()來處理正則表達式,但是這樣更乾淨。 – Jin

0

顯然你錯過了左手任務,使你的代碼在給定條件下工作。

input.replace("PI", "3.14"); 

但它只會更換,如果input包含PI,同時它會爲piPi嘗試爲好。爲了更好地處理此問題,我認爲您可以使用"[pP][iI]""[pP]{1}[iI]{1}"作爲替換模式,該模式將查找一次出現P or p後跟一次出現I or i如下:

  String input = "xPIyPizpIapib"; 
  input = input.replaceAll("[pP][iI]", "3.14");  
  System.out.println(input); //<- all "pi"s irrespective of case are replaced. 

    String input = "xPIyPizpIapib"; 
    input = input.replaceAll("[pP]{1}[iI]{1}", "3.14"); 
    System.out.println(input); //<- all "pi"s irrespective of case are replaced. 

請注意:這也將代替pI,如果找到。

+0

你不需要計數; ''[pP] [iI]「'同樣適用。另外,OP的原始代碼排除了「」pI「'。 –

+0

@TedHopp:謝謝!我在答案中加入了兩個註釋。 –