我解決了下面列出的一個問題,它工作正常,但似乎笨重,效率不高。我正在尋找改進方法並獲得更優雅的解決方案,我有什麼建議可以改進它?任何意見讚賞。謝謝!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;
}
你可能想了解所謂的「正則表達式」。它們通常用於匹配和替換基於特定條件的輸入。 –
感謝您的建議@still_learning,我一定會用正則表達式重寫我的解決方案,難怪是否有一個線路解決方案,我只是沒有太多的經驗使用它們。 –
我希望能爲所有提到的測試案例工作的解決方案,而不僅僅是其中一些,否則建議的解決方案不是一種選擇。謝謝! –