Talvez não seja tão elegante quanto outras abordagens, mas é bastante sólido e fácil de seguir, especialmente. para pessoas mais novas em Java. Uma coisa que me impressiona sobre a classe String é a seguinte: ela existe há muito tempo e, embora ofereça suporte a uma substituição global por regexp e uma substituição global por Strings (via CharSequences), essa última não possui um parâmetro booleano simples : 'isCaseInsensitive'. Realmente, você pensaria que, apenas adicionando esse pequeno interruptor, todos os problemas que sua ausência causa para iniciantes, em especial, poderiam ter sido evitados. Agora no JDK 7, o String ainda não suporta esta pequena adição!
Bem, de qualquer maneira, vou parar de me segurar. Para todos, especialmente os mais novos em Java, aqui está o seu deus ex machina recortar e colar . Como eu disse, não é tão elegante e não ganha nenhum prêmio de codificação, mas funciona e é confiável. Quaisquer comentários, fique à vontade para contribuir. (Sim, eu sei, o StringBuffer é provavelmente a melhor escolha para gerenciar as duas linhas de mutação da cadeia de caracteres, mas é fácil o suficiente trocar as técnicas.)
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;
}