2015-06-27 106 views
1

我試圖替換字符串中所有出現的單詞。然而,通過這段代碼,我只能找到它的第一次出現並將其替換。有什麼辦法可以擴展這段代碼來替換整個字符串中的單詞嗎?我試圖在不使用Java中的替換方法的情況下執行此操作,因爲我已經知道如何使用這些函數,所以我想知道是否有另一種方式去實現它。在字符串中替換字符而不使用在Java中替換

public static String replace(String old, String newWord, String input) {  

int i = input.indexOf(old); 

if (i < 0) { 
    return input; 
} 

    String partBefore = input.substring(0, i); 
    String partAfter = input.substring(i + old.length()); 

    return partBefore + newWord + partAfter; 
} 
+5

'new'是Java中的保留關鍵字 – Alex

+0

謝謝!修正 –

+0

使用['indexOf(String str,int fromIndex)'](http://docs.oracle。com/javase/7/docs/api/java/lang/String.html#indexOf(java.lang.String,%20int)) –

回答

1

首先,您需要某種循環。可能是while

在循環中,由於您要替換「舊」字符串,因此您可以保持循環,直到您再也找不到它爲止。但是如果你想避免重新搜索字符串的第一部分,或者如果你想允許替換包含它所替換的字符串(沒有循環無限),那麼一旦你完成了每個替換,使用String#indexOf(String str, int fromIndex),它讓你從字符串的中間繼續。

-3

發現這個answer

String message = "%%NAME is inviting you."; 
String name = "Diana"; 
String result = message.replaceAll("%%NAME", name); 
+0

OP說:「*不使用'替換()'*」 –

+0

在技術上它不能取代,但好吧我的壞:) –

0

首先,不使用new一個變量名。這是一個保留字。

其次,爲了取代多個出現,你應該有一個循環。

最後,最好使用StringBuilder創建新的String,而不是String連接。

這是未經測試,但這樣的事情應該工作:

public static String replace(String oldStr, String newStr, String input) {  

    int i = input.indexOf(oldStr); 
    if (i < 0) { 
     return input; 
    } 
    StringBuilder buffer = new StringBuilder(); 
    int prev = 0; 
    while (i >= 0) { 
     String partBefore = input.substring(prev, i); 
     prev = i + oldStr.length(); 
     buffer.append(partBefore); 
     buffer.append(newStr);  
     i = input.indexOf(oldStr, i + oldStr.length()); 
    } 
    buffer.append(input.substring(i+oldStr.length())); 

    return buffer.toString(); 
} 
+0

這段代碼編譯和一切,但是,一旦運行一個測試用例只是增加了一個字在前面我想刪除,但實際上並沒有刪除 –

+0

這個詞@LBS_Me哦,我知道我錯了,把'prev = i;'改成'prev = i + oldStr.length();' – Eran

1
public static String replace(String old, String newWord, String input) {  
    int i = input.indexOf(old); 
    if (i < 0) { 
     return input; 
    } 
    String partBefore = input.substring(0, i); 
    String partAfter = input.substring(i + old.length()); 
    return partBefore + newWord + replace(old, newWord, partAfter); 
} 

然而,這是更有效地收集點點滴滴在一個StringBuilder。

public static String replace(String oldStr, String newStr, String input) {  
    StringBuilder sb = new StringBuilder(); 
    int i; 
    int prev = 0; 
    while((i = input.indexOf(oldStr, prev)) >= 0){ 
     sb.append(input.substring(prev, i)).append(newStr); 
     prev = i + oldStr.length(); 
    } 
    sb.append(input.substring(prev)); 
    return sb.toString(); 
} 
+0

@Bohemian It 「可以使用遞歸。 – laune

+0

我想我們想出了相同的想法:) –

+0

@ErwinBolwidt只是試圖證明遞歸可能沒有太多的努力。在效率方面,使用StringBuilder來收集未經修改和替換的碎片更爲可取。 – laune

1

有一個簡單的解決方案,使用遞歸。一旦你已經取代了字符串中的第一次的話,你就可以再次調用替換方法替換字符串的partAfter部分字:

public static String replace(String old, String newWord, String input) {  

    int i = input.indexOf(old); 

    if (i < 0) { 
     return input; 
    } 

    String partBefore = input.substring(0, i); 
    String partAfter = input.substring(i + old.length()); 

    return partBefore + newWord + 
      replace(old, newWord, partAfter); // <<-- Note recursion here 
} 

這隻能從原始來源改變一行。

+0

這一個工程是完美的,除非如果該單詞是在另一個單詞內,就像你想從單詞「移動」中移除'刪除'例如? –

+0

這只是工作;你可以試試它:'replace(「move」,「」,「remove」)' –

0

使用遞歸:

public static String replaceAll(String old, String newWord, String input) { 

    int i = input.indexOf(old); 

    if (i < 0) 
     return input; 

    String partBefore = input.substring(0, i); 
    String partAfter = input.substring(i + old.length()); 

    return replaceAll(old, newWord, partBefore + newWord + partAfter); 
} 

使用做,雖然並繼續更換的話:

public static String replaceAll(String old, String newWord, String input) { 

    boolean loop = true; 

    do { 
     int i = input.indexOf(old); 

     if (i > 0) { 

      String partBefore = input.substring(0, i); 
      String partAfter = input.substring(i + old.length()); 
      input = partBefore + newWord + partAfter; 

     } else 
      loop = false; 

    } while (loop); 

    return input; 
} 
0

這裏是代碼

import java.util.Scanner; 
public class replacechar { 
     String line; 
     String s = ""; 
     char from ; 
     char to ; 
     public replacechar() 
     { 
      Scanner scan = new Scanner(System.in); 
      System.out.println("Enter The String"); 
      line = scan.nextLine(); 
      System.out.println("Enter The Character you want to changer"); 
      from = scan.nextLine().charAt(0); 
      System.out.println("Enter the Character you want to replace with"); 
      to = scan.nextLine().charAt(0); 
      replacecharacter(from,to); 
     } 
     public void replacecharacter(char f,char t) 
     { 
      for(int i =0;i< line.length();i++) 
      { 

       if(line.charAt(i) == f) 
       { 
        s += t; 
       } 
       else 
       { 
        s += line.charAt(i); 
       } 

      } 
      System.out.println(s); 
     } 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     replacechar obj = new replacechar(); 
    } 

} 
0

沒有把握OP仍在尋找答案,但它米幫助別人。這裏是我的代碼,只是for循環和java的子串方法...

public static void main(String ar[]) 
{ 

String str = "This is some string. replace lower case is with IS"; 
     String pattern = "is"; 
     String replaceWith = "IS"; // word to replace with 
     System.out.println(replaceString(str, pattern, replaceWith)); 

    } 

    static String replaceString(String str, String pattern, String replaceWith) { 
     String temp = ""; 
     String replacedString = ""; // Replaced String 
     int remainingString = 0; // append the rest of the string after last 
            // occurance of pattern. 
     for (int i = 0; i <= str.length() - pattern.length(); i++) { 
      temp = str.substring(i, i + 1); 

      if (str.substring(i, i + pattern.length()).equals(pattern)) { 
       temp = replaceWith + " "; 
       i += pattern.length(); 

      } 
      remainingString = i; 
      replacedString += temp; 

     } 
     replacedString += str.substring(remainingString + 1, str.length()); 

     return replacedString; 
    } 
}