Не такий елегантний, як інші підходи, але досить міцний і простий у дотриманні, особливо. для людей, які новіші для Java. Одне, що мене цікавить про клас String, це: це існує вже дуже давно, і він підтримує глобальну заміну на регулярний вираз і глобальну заміну на Strings (через CharSequences), але останній не має простого булевого параметра : 'isCaseInsensitive'. Дійсно, ви могли подумати, що, додавши цей маленький перемикач, усіх проблем, які його відсутність викликає, особливо для початківців, можна було б уникнути. Тепер на JDK 7, String досі не підтримує це одне маленьке доповнення!
Ну все одно я перестану хапатись. Для всіх, особливо новіших для Java, ось ваш виріз і вставка deus ex machina . Як я вже говорив, не настільки елегантно і не виграє вам жодного призового кодування, але це працює і є надійним. Будь-які коментарі, не соромтесь робити внесок. (Так, я знаю, StringBuffer - це, мабуть, кращий вибір керування двома символьними рядками мутації рядків, але досить просто поміняти методи.)
public String replaceAll(String findtxt, String replacetxt, String str,
boolean isCaseInsensitive) {
if (str == null) {
return null;
}
if (findtxt == null || findtxt.length() == 0) {
return str;
}
if (findtxt.length() > str.length()) {
return str;
}
int counter = 0;
String thesubstr = "";
while ((counter < str.length())
&& (str.substring(counter).length() >= findtxt.length())) {
thesubstr = str.substring(counter, counter + findtxt.length());
if (isCaseInsensitive) {
if (thesubstr.equalsIgnoreCase(findtxt)) {
str = str.substring(0, counter) + replacetxt
+ str.substring(counter + findtxt.length());
// Failing to increment counter by replacetxt.length() leaves you open
// to an infinite-replacement loop scenario: Go to replace "a" with "aa" but
// increment counter by only 1 and you'll be replacing 'a's forever.
counter += replacetxt.length();
} else {
counter++; // No match so move on to the next character from
// which to check for a findtxt string match.
}
} else {
if (thesubstr.equals(findtxt)) {
str = str.substring(0, counter) + replacetxt
+ str.substring(counter + findtxt.length());
counter += replacetxt.length();
} else {
counter++;
}
}
}
return str;
}