Może nie tak elegancki jak inne podejścia, ale jest dość solidny i łatwy do naśladowania, szczególnie. dla osób nowszych w Javie. Jedną rzeczą, która mnie przekonuje o klasie String, jest to: istnieje od bardzo dawna i chociaż obsługuje globalne zastępowanie wyrażeniami regularnymi i globalne zastępowanie ciągami (przez CharSequences), to ostatnie nie ma prostego parametru boolowskiego : „isCaseInsensitive”. Naprawdę, można by pomyśleć, że wystarczy dodać ten jeden mały przełącznik, aby uniknąć wszystkich problemów, które jego brak powoduje szczególnie dla początkujących. Teraz w JDK 7, String nadal nie obsługuje tego jednego małego dodatku!
W każdym razie, przestanę się skarżyć. Dla wszystkich, zwłaszcza nowszych w Javie, oto twoja deus ex machina do wycinania i wklejania . Jak powiedziałem, nie jest tak elegancki i nie wygra żadnych nagród za zgrabne kodowanie, ale działa i jest niezawodny. Wszelkie komentarze, nie krępuj się. (Tak, wiem, StringBuffer jest prawdopodobnie lepszym wyborem do zarządzania dwiema liniami mutacji ciągu znaków, ale dość łatwo jest zamienić techniki).
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());
counter += replacetxt.length();
} else {
counter++;
}
} else {
if (thesubstr.equals(findtxt)) {
str = str.substring(0, counter) + replacetxt
+ str.substring(counter + findtxt.length());
counter += replacetxt.length();
} else {
counter++;
}
}
}
return str;
}