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?
Das liegt daran, dass das Dollarzeichen ein Sonderzeichen in einer Ersetzungszeichenfolge ist. Verwenden Sie Matcher.quoteReplacement()
, um diese Art von Zeichen zu umgehen.
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. BenutzenMatcher.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.
So bekommen wir:
%Vor% 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".
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.
Ich bin mir nicht sicher, ob ich Ihre Frage wirklich verstanden habe, aber versuchen Sie
%Vor%