String ersetzt den Fehler mit $ sign

8

Ich habe ein Problem mit dem Ersetzen einer Zeichenfolge in Java ...

Die Zeile lautet:

%Vor%

Diese Zeile funktioniert nicht mit $ sign in calSubject.

was die Subjektvariable ist, eine dynamische Subjektlinienvariable aus einer Datei. zum Beispiel so: Calnot = [calEvent]

Was ich versuche zu tun, ist, den calEvent Platzhalter durch die Subjektvariable zu ersetzen. aber wie ich es tat, funktioniert es nicht, weil es abstürzt, wenn das Thema ein $ -Zeichen enthält.

Irgendeine Idee, wie ich das tun kann, damit es nicht bricht, wenn das Thema ein $ -Zeichen oder irgendwelche Charaktere für diese Angelegenheit enthält?

    
OakvilleWork 15.04.2013, 15:17
quelle

5 Antworten

20

Das liegt daran, dass das Dollarzeichen ein Sonderzeichen in einer Ersetzungszeichenfolge ist. Verwenden Sie Matcher.quoteReplacement() , um diese Art von Zeichen zu umgehen.

%Vor%

Aus dem Dokument von String.replaceAll() :

  

Beachten Sie, dass Backslashes ( \ ) und Dollarzeichen ( $ ) in der Ersetzung stehen   string kann dazu führen, dass die Ergebnisse anders sind, als wenn dies der Fall wäre   als literale Ersatzzeichenfolge behandelt werden; siehe Matcher.replaceAll. Benutzen    Matcher.quoteReplacement(java.lang.String) , um das Besondere zu unterdrücken   Bedeutung dieser Zeichen, falls gewünscht.

Beachten Sie, dass das Dollarzeichen verwendet wird, um auf die entsprechenden Erfassungsgruppen im regulären Ausdruck ( , Matcher.quoteReplacement() usw.) zu verweisen.

BEARBEITEN

$ wurde in Java 1.5 eingeführt. Wenn Sie in Java 1.4 stecken, müssen Sie $ manuell durch Ersetzen durch String.replaceAll() in der Zeichenfolge entfernen. Aber da \ auch die $ und die \ als Sonderzeichen nehmen würde, muss man sie einmal umgehen und man muss auch noch einmal% coid_de% für die Java-Laufzeit entziehen.

%Vor%

So bekommen wir:

%Vor%     
zakinster 15.04.2013, 15:23
quelle
5

Wenn Sie das Feature regex nicht benötigen, können Sie diese Methode der String-Klasse verwenden: ersetzen (CharSequence-Ziel, CharSequence-Ersatz)

Es speichert auch Ihre "Escape" Backslashes.

api doc:

  

Ersetzt jede Teilzeichenfolge dieser Zeichenfolge, die mit dem Literalziel übereinstimmt   Sequenz mit der angegebenen Literalersatzsequenz . Das   der Austausch erfolgt vom Anfang der Zeichenfolge bis zum Ende, z   Beispiel: Das Ersetzen von "aa" durch "b" in der Zeichenfolge "aaa" führt zu   "ba" anstatt "ab".

    
Kent 15.04.2013 15:22
quelle
2

Aus der Dokumentation von replaceAll:

  

Beachten Sie, dass Backslashes () und Dollarzeichen ($) in der Ersetzung sind   string kann dazu führen, dass die Ergebnisse anders sind, als wenn dies der Fall wäre   als literale Ersatzzeichenfolge behandelt werden; siehe Matcher.replaceAll. Benutzen   java.util.regex.Matcher.quoteReplacement zum Unterdrücken des speziellen   Bedeutung dieser Zeichen, falls gewünscht.

Und in Matcher.replaceAll

  

Dollarzeichen können als Referenzen auf erfasste Subsequenzen behandelt werden   wie oben beschrieben, und Backslashes werden verwendet, um Literalzeichen zu entkommen   in der Ersatzzeichenfolge.

    
rarry 15.04.2013 15:23
quelle
0

Ich bin mir nicht sicher, ob ich Ihre Frage wirklich verstanden habe, aber versuchen Sie

%Vor%     
Michael Lemke 15.04.2013 15:24
quelle
0

Bitte verwenden Sie

%Vor%     
Amit Sharma 15.04.2013 15:24
quelle

Tags und Links