2015-11-29 157 views
2

我解決了下面列出的一個問題,它工作正常,但似乎笨重,效率不高。我正在尋找改進方法並獲得更優雅的解決方案,我有什麼建議可以改進它?任何意見讚賞。謝謝!java字符串自定義替換優雅的解決方案

問題: 給定一個字符串,返回一個字符串,其中小寫字「is」的每個外觀已被替換爲「不是」。單詞「is」不應該緊接在一個字母的前面或後面,因此例如「this」中的「is」不計數。

測試:

notReplace("is test") → "is not test" 
    notReplace("is-is") → "is not-is not" 
    notReplace("This is right") → "This is not right" 
    notReplace("This is isabell") → "This is not isabell" 
    notReplace("")→ "" 
    notReplace("is") → "is not" 
    notReplace("isis") → "isis" 
    notReplace("Dis is bliss is") → "Dis is not bliss is not" 
    notReplace("is his") → "is not his"  
    notReplace("xis yis") → "xis yis" 
    notReplace("AAAis is") → "AAAis is not" 

我的解決辦法:

public static String notReplace(String str) { 
    String result=""; 
    int begin = 0; 
    if (str.equals("is")) 
     return "is not"; 
    int index = str.indexOf("is"); 
    if (index==-1) 
     return str; 
    while (index>-1){ 
      if (index+begin==0 && !Character.isLetter(str.charAt(index+2))){ 
       result += "is not"; 
      begin = index+2; 
      index = str.substring(begin).indexOf("is"); 
      } 
      else if (index+begin==0 && Character.isLetter(str.charAt(index+2))){ 
       result += str.substring(begin,begin+index)+"is"; 
       begin += index+2; 
       index = str.substring(begin).indexOf("is"); 
      } 
      else if (index+begin == str.length()-2 && !Character.isLetter(str.charAt(index+begin-1))){ 
       result += str.substring(begin, begin+index)+"is not"; 
       return result; 
      } 
      else if(!Character.isLetter(str.charAt(index+begin-1))&&!Character.isLetter(str.charAt(index+begin+2))){ 
       result += str.substring(begin,begin+index)+"is not"; 
       begin += index+2; 
       index = str.substring(begin).indexOf("is"); 
      } 
      else { 
       result += str.substring(begin,begin+index)+"is"; 
       begin += index+2; 
       index = str.substring(begin).indexOf("is"); 
      } 
     } 
     result += str.substring(begin); 
     return result; 
} 
+0

你可能想了解所謂的「正則表達式」。它們通常用於匹配和替換基於特定條件的輸入。 –

+0

感謝您的建議@still_learning,我一定會用正則表達式重寫我的解決方案,難怪是否有一個線路解決方案,我只是沒有太多的經驗使用它們。 –

+0

我希望能爲所有提到的測試案例工作的解決方案,而不僅僅是其中一些,否則建議的解決方案不是一種選擇。謝謝! –

回答

2

您應該使用Pattern.compile,然後replaceAll。我試圖寫regex但我失敗了。

所以,你應該做這樣的事情:

class Replacer { 
    static Pattern isPattern = Pattern.compile("...(is)..."); // here you have to figure out the right pattern 

    public static String notReplace(String input) { 
     return isPattern.matcher(input).replaceAll("is not"); 
    } 
} 

我認爲這是最乾淨的解決方案,也遠遠快於input.replaceAll其編譯每次Pattern

用正則表達式也許你應該使用某物像[^\\p{Alphanum}](is)[^\\p{Alphanum]

UPDATE

,你必須使用所謂的字邊界\b這樣的表達應該是這樣的:Pattern.compile("\\b(is)\\b")並通過所有你的測試:-)

+0

感謝輸入k0ner,這是我認爲,剩下的一件事就是找出正確的正則表達式。 –

+0

查看更新。我終於弄清楚了正確的正則表達式 – k0ner

+0

感謝k0ner,做得很好,這正是我所需要的,最終代碼: public String notReplace(String str){0}返回str.replaceAll(「\\ bis \\ b」,「不是」); } –

3

該解決方案適用於大部分的例子:

public String notReplace(String str) { 
    // Add surrounding whitespace in case of an "is" at the beginning or end 
    str = " " + str + " "; 
    // Do replacement 
    String result = str.replaceAll(" is ", " is not "); 
    // Other replacements... 
    // result = result.replaceAll("", ""); 

    return result.trim(); // Remove added whitespaces again using trim() 
} 

對於例子在未被使用此代碼替換你需要添加一些額外的代碼行。或者看看正則表達式 - 就像still_learning所說的那樣。

希望這會有所幫助。

+0

感謝regapictures,我很欣賞你的意見,但是你的解決方案只覆蓋(「is」)情況的一種情況,並且在所有其他測試中失敗,例如「1is」,「is + 123」等等。這不僅僅如此簡單。 –

+0

這是我從我的測試得到的輸出: 沒有測試 ISIS 這是不對的 這不是ISABELL 不 ISIS 派息不是幸福不 是不是他的 紅雙喜yis AAA is not – regapictures

+0

regapictures,這是正確的,但是這個解決方案仍然不處理由非空白字符分隔的「is」。 –

0

你可以使用這個正則表達式。下面將回報你在你的例子指定的內容:

str.replaceAll("([^a-zA-Z]|^)is([^a-zA-Z]|$)", "$1is not$2"); 
0

隨着@ k0ner的幫助下找到了一個在線解決方案:

public String notReplace(String str) { 
    return str.replaceAll("\\bis\\b","is not"); 
} 
0

所有在你的例子給出的話可以用這個答案,如果安排你喜歡的東西「這不是伊莎貝爾是」然後通過這個只有最後「是」將被替換,而不是替換「是」「不是」

String ss = word.replaceAll("\\bis\\b(?!=*.not\\b)", "is not"); 

link

+0

感謝您的輸入,但出於要求,您將看到第一個「是」必須被替換(所有「是」,前後都沒有字母。) –

+0

您希望它像'「這不是isabell是「' - - - >'」這不是isabell不是「'??? –

+0

是的@Madushan Perera,這是問題的作者想要的。這只是一個練習問題,並不是真正的用法。 –