Ich stehe gerade auf dem Schlauch: Ich habe einen String, der sowohl "\." wie auch nackte "." (ohne Backslash davor) enthalten kann. Jetzt will ich jeden "\." in einen "." und jeden "." in einen "\" übersetzen.
Da das irgendwie “kreuzweise” ist, ist mir nur eine Lösung mit drei replace- Operationen eingefallen, wo ich das eine Pattern erst einmal in ein Hilfszeichen übersetze, dann das zweite Pattern direkt, und dann das Hilfszeichen (so ähnlich wie man zwei Variablen über eine Temp-Variable tauscht):
String neu = alt.replace("\\.", "§")
.replace('.','\\')
.replace('§','.');
Geht das irgendwie mit zwei Operationen, oder sogar irgendwie “simultan”? Ist nicht schlimm, wenn ich bei meiner hässlichen Lösung bleiben muss, aber es interessiert mich wirklich, ob es nicht doch besser geht.
Danke, sehr interessant! Hübscher ist es ehrlich gesagt nicht, aber wenn ich das Risiko vermeiden kann, dass mein “Ersatzzeichen” doch im String vorkommt, dann nehme ich lieber diese Version.
Im Zweifelsfall kannst du bei deiner ersten Lösung ja auch in "### DIESER UNSINN KOMMT NICHT VOR ###" ersetzen und wieder zurück.
Man sieht wieder mal, wie schade es ist, dass Java in Zeichenketten die doppelten Backslashes verwendet und dass es nicht Perls s~regex~ersetzung~ kennt. Ich hab mir zwar eine kleine Klasse dafür geschrieben, aber eingebaut wäre es schöner.
C++ kennt wiederum nicht interpretierte Zeichenketten mit Klammeraffen davor, etwa @"\d+\.".
Effizienzvorteil der Schleifenvariante steigt freilich…,
noch mehr vielleicht ganz manuell mit Indexof, StringBuilder usw., falls nur feste Texte zu ersetzen
So ähnlich wie es ButAlive macht funktioniert das auch in C[meine neue Tastatur hat kein Hashtag merke ich gerade], bloß dass sich die Funktion in Matcher befindet. Das wäre auch mein Vorschlag - Matcher zu erweitern. Am besten sogar mit Lambdas (return Replacement_String_For_Match).