Sagen wir, ich habe eine Datei, die etwas Text enthält. Es gibt Teilstrings wie "substr1", "substr2", "substr3" usw. darin. Ich muss alle diese Teilstrings durch irgendeinen anderen Text ersetzen, wie "repl1", "repl2", "repl3". In Python würde ich ein Wörterbuch wie folgt erstellen:
%Vor% und erstellen Sie das Muster, das die Schlüssel mit '|' verbindet, und ersetzen Sie es durch re.sub
function.
Gibt es einen ähnlich einfachen Weg, dies in Java zu tun?
So übersetzt sich Ihr Python-Vorschlag in Java:
%Vor%Dieser Ansatz macht einen simultanen (d. h. "sofort") Ersatz. Wenn Sie zufällig
haben %Vor% dann würde dieser Ansatz "a b" -> "b c"
im Gegensatz zu den Antworten geben, was darauf hindeutet, dass Sie mehrere Aufrufe an replace
oder replaceAll
ketten sollten, was "c c"
ergeben würde.
(Wenn Sie diesen Ansatz zum programmatischen Erstellen der Regexp verallgemeinern, vergewissern Sie sich, dass Sie Pattern.quote
für jedes einzelne Suchwort und Matcher.quoteReplacement
für jedes Ersatzwort verwenden.)
StringUtils.replaceEach
im Apache Commons Lang Projekt , aber es funktioniert auf Strings.
Zuerst eine Demonstration des Problems:
%Vor%Dies soll cats ersetzen = & gt; Hunde und Hunde = & gt; Wellenformen, aber die sequentielle Ersetzung funktioniert auf das Ergebnis der vorherigen Ersetzung, so ist die unglückliche Ausgabe:
Ich habe drei Wellensittiche und zwei Wellensittiche.
Hier ist meine Implementierung einer simultanen Ersatzmethode. Es ist einfach zu schreiben mit String.regionMatches
:
Testen:
%Vor%Ausgabe:
Ich habe drei Hunde und zwei Wellensittiche.
Außerdem ist es manchmal nützlich, wenn Sie simultan nach dem längsten Spiel suchen. (Die strtr
Funktion von PHP macht dies zum Beispiel.) Hier ist meine Implementierung dafür:
Warum würden Sie das brauchen? Beispiel folgt:
%Vor%Ausgabe:
Java ist zu JavaScript wie Ham zu Hamster ist
Wenn wir simultaneousReplace
anstelle von simultaneousReplaceLongest
verwendet hätten, hätte die Ausgabe "HamScript" anstelle von "Hamster":)
Beachten Sie, dass bei den obigen Methoden die Groß- / Kleinschreibung beachtet wird. Wenn Sie die Groß- / Kleinschreibung nicht beachten müssen, ist es einfach, die obigen Einstellungen zu ändern, da String.regionMatches
einen Parameter ignoreCase
annehmen kann.