public String replaceAll(String regex, String replacement) und das $-Zeichen

takidoso

Erfahrenes Mitglied
Hallo und Halli,
habe das Bedürfnis einen String mit einem anderen in einem noch größeren String zu ersetzen.
Dafür bietet sich ja eigentlich String.replaceAll() prima an (Signatur siehe Titel).
Leider habe ich feststellen müssen, dass das nur nicht mit Strings geht, die eine Dollarzeichen ($) enthalten.
Grund ist offenbar dass der in replaceAll verwendete Matcher das Dollarzeichen für das Einfügen von Gruppen vorsieht (so ich das überhaupt richtig interpretiere).
Nun kann man natürlich das $-Zeichen escapen, was aber dazuführt, dass dann nicht $ sondern \$ in meinem Text steht, was nicht das Ziel war :(
Wie kann man es gescheit hinbekommen ein Dollarzeichen in den zu ersetzenden String einzubringen, der tatsächlich dann als $ in dem Resultat erscheint?

Für gute Ideen bin ich wirklich dankbar, denn mir rennt irgendwie die Zeit davon.


Takidoso
 
Hi.

Warum verwendest du nicht String.replace() wenn du überhaupt keine reg. Ausdrücke verwenden willst?

Ansonsten funktioniert auch replaceAll bei mir tadellos:
Java:
"a b a bb a".replaceAll("a ", "\\$ ");
Ergebnis:
Code:
$ b $ bb a
Gruß
 
Ich glube ich habe nun doch noch eine Möglichkeit gefunden.
http://www.bennadel.com/blog/255-Is...d-Java-s-Matcher-AppendReplacement-Method.htm
brachte mich auf die richtige Idee, auch wenn der Sourcecode da eher an .Net wegen der Groß/Klein-Schreibung erinnert.

Ich muss ergänzend hinzufügen bei meinem Ursächlichen Problem, dass ich für den ersatz Properties verwende.

In diesen Properties muss ich demnach nicht nur \\ sondern \\\ angeben :)
Kaum machts man richtig funktioniert es auch. Auch wenn ich im Detail nicht wirklich verstehe warum ich nun drei Backslashes benötige und warum 2 dazuführen ein \$ in meinen Text reinzubringen.

mit freundlichen Grüßen

Takidoso
 
Ich glube ich habe nun doch noch eine Möglichkeit gefunden.
http://www.bennadel.com/blog/255-Is...d-Java-s-Matcher-AppendReplacement-Method.htm
brachte mich auf die richtige Idee, auch wenn der Sourcecode da eher an .Net wegen der Groß/Klein-Schreibung erinnert.
Du beziehst dich auf die Matcher.quoteReplacement() Methode von der da in den Kommentaren die Rede ist?

Ich muss ergänzend hinzufügen bei meinem Ursächlichen Problem, dass ich für den ersatz Properties verwende.

In diesen Properties muss ich demnach nicht nur \\ sondern \\\ angeben :)
Kaum machts man richtig funktioniert es auch. Auch wenn ich im Detail nicht wirklich verstehe warum ich nun drei Backslashes benötige und warum 2 dazuführen ein \$ in meinen Text reinzubringen.
Das kann ich nicht nachvollziehen:
Code:
# a.properties
r1 = a \\$
r2 = a \\\$
r3 = a $
Java:
p.load(stream);
"a b a bb a".replaceAll("a ", p.getProperty("r1"));
"a b a bb a".replaceAll("a ", p.getProperty("r2"));
"a b a bb a".replaceAll("a ", Matcher.quoteReplacement(p.getProperty("r3")));

"a b a bb a".replace("a ", p.getProperty("r3"));
Ergebnis:
Code:
a $b a $bb a
a $b a $bb a
a $b a $bb a
a $b a $bb a
3 Backslashes sind unsinnig, da es keine Escape-Sequenz \$ gibt und somit gilt p.getProperty("r1").equals(p.getProperty("r2")).

Gruß
 
Jo habe ich gerade auch gemerkt, dass dies mein Ursächliches Problem nicht löst.
Intention war es mit einem OS-Aufruf mittels echo $0 die verwendete Shell rausfinden zu können. Da es mit 2 Backslashes nicht ging, dachte ich es könnte daran liegen, dass für echo das $0 escaped werden würde. Aber offenbar kann man mittels OS-Call nicht mittels echo $0 den wert von $0 bekommen, oder er wird gar nicht erst gefüllt ?
naja irgendwie misteriös.
 

Neue Beiträge

Zurück