byłoby prawdopodobnie trzeba wymienić trzy połączenia, aby to zrobić.
Pierwszy zmienia jeden ze znaków na wartość pośrednią, drugi zastępuje pierwszy, a trzeci zastępuje wartość pośrednią drugim zamiennikiem.
String str = "Hello World";
str = star.replace("H", "*").replace("W", "H").replace("*", "W");
Edit
W odpowiedzi na niektóre z poniższych obaw co do prawidłowości tej metody zamiana znaków w String
. To zadziała, nawet jeśli już jest *
w String
. Wymaga to jednak dodatkowych kroków polegających na tym, aby po pierwsze uniknąć pojawienia się *
i uniknięcia ich przed zwróceniem nowego String
.
public static String replaceCharsStar(String org, char swapA, char swapB) {
return org
.replace("*", "\\*")
.replace(swapA, '*')
.replace(swapB, swapA)
.replaceAll("(?<!\\\\)\\*", "" + swapB)
.replace("\\*", "*");
}
Edycja 2
Po przeczytaniu niektórych innych odpowiedzi, nowej wersji, która nie tylko praca w Javie 8, współpracuje z wymianą znaków, które muszą być uciekł w regex, na przykład [
i ]
i bierze pod uwagę obawy dotyczące korzystania z prymitywów char
do manipulowania obiektami String
.
public static String swap(String org, String swapA, String swapB) {
String swapAEscaped = swapA.replaceAll("([\\[\\]\\\\+*?(){}^$])", "\\\\$1");
StringBuilder builder = new StringBuilder(org.length());
String[] split = org.split(swapAEscaped);
for (int i = 0; i < split.length; i++) {
builder.append(split[i].replace(swapB, swapA));
if (i != (split.length - 1)) {
builder.append(swapB);
}
}
return builder.toString();
}
Co jeśli ciąg zawiera już '*'? Następnie niepożądane znaki są modyfikowane. – Arjuna
W takim przypadku musisz użyć alternatywnego pośredniego znaku. Najlepiej wybrać coś niejasnego, jeśli będzie to użyte w kodzie produkcyjnym, prawdopodobnie powinienem dodać to jako ostrzeżenie. – PeterK
Jeśli mamy gwarancję, że niektóre znaki nie są używane, możemy wybrać jedną z nich. W przeciwnym razie lepiej jest przechodzić między znakami i modyfikować je na podstawie warunku. – Arjuna