Возможно, не так элегантно, как другие подходы, но он довольно надежен и прост в использовании, особенно. для новичков в Java. Одна вещь, которая мне нравится в классе String, заключается в следующем: он существует уже очень давно, и хотя он поддерживает глобальную замену регулярным выражением и глобальную замену строками (через 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;
}