Was ist der Unterschied zwischen java.lang.String replace()
und replaceAll()
Methoden, außer dass später Regex verwendet wird? Gibt es bei einfachen Substitutionen wie Ersetzen .
durch /
einen Unterschied?
221
In java.lang.String
nimmt die replace
Methode entweder ein Paar Zeichen oder ein Paar von CharSequence
Zeichen (von denen String eine Unterklasse ist, sodass glücklicherweise ein Paar Zeichenfolgen verwendet werden). Die replace
Methode ersetzt alle Vorkommen eines Zeichens oder CharSequence
. Andererseits sind beide String
Argumente für replaceFirst
und replaceAll
reguläre Ausdrücke (Regex). Die Verwendung der falschen Funktion kann zu subtilen Fehlern führen.
str.replaceAll(regex, repl)
derselbe wiePattern.compile(regex).matcher(str).replaceAll(repl)
. Es gibt also einen großen Overhead, abhängig davon, wie viel es verwendet wird.String#replace(target, replacement)
das gleiche tut, außer dass es die Zeichenfolgen zitiert:Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
Gibt es einen Grund, warumString#replace
schneller als wäreString#replaceAll
? Es scheint nicht so, daString#replace
nur zusätzliche Operationen ausgeführt werden.replaceAll
. Die Antwort ist mehr überreplace
F: Was ist der Unterschied zwischen den
java.lang.String
Methodenreplace()
undreplaceAll()
ansonsten verwendet der spätere Regex.A: Nur die Regex. Sie ersetzen beide alle :)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
PS:
Es gibt auch eine
replaceFirst()
(die eine Regex nimmt)quelle
CharSequence
. Beidesreplace()
undreplaceAll()
"arbeiten mitCharSequence
". Es ist , dassreplaceAll()
die gegebene AuffassungCharSequence
als regulärer Ausdruck , so dass es für aussieht Regex -Übereinstimmungen , währendreplace()
der gegebenen betrachtetCharSequence
als einfachen Suchtext , so dass es für aussieht Vorkommen davon.Beides
replace()
undreplaceAll()
alle Vorkommen in der Zeichenfolge ersetzen.Beispiele
Ich finde immer Beispiele hilfreich, um die Unterschiede zu verstehen.
replace()
Verwenden
replace()
Sie diese Option, wenn Sie nur einigechar
durch anderechar
oderString
andereString
(tatsächlichCharSequence
) durch andere ersetzen möchten .Beispiel 1
Ersetzen Sie alle Vorkommen des Charakters
x
durcho
.Beispiel 2
Ersetzen Sie alle Vorkommen der Zeichenfolge
fish
durchsheep
.replaceAll()
Verwenden
replaceAll()
Sie diese Option, wenn Sie ein Muster für reguläre Ausdrücke verwenden möchten .Beispiel 3
Ersetzen Sie eine beliebige Zahl durch eine
x
.Beispiel 4
Entfernen Sie alle Leerzeichen.
Siehe auch
Dokumentation
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
Reguläre Ausdrücke
quelle
Die
replace()
Methode ist überladen, um sowohl ein Grundelementchar
als auch einCharSequence
als Argumente zu akzeptieren .Was die Leistung betrifft, ist die
replace()
Methode etwas schneller alsreplaceAll()
weil die letztere zuerst das Regex-Muster kompiliert und dann übereinstimmt, bevor sie endgültig ersetzt wird, während die erstere einfach mit dem angegebenen Argument übereinstimmt und ersetzt.Da wir die RegexMuster Matching ist ein wenig komplexer und folglich langsamer wissen, dann lieber
replace()
überreplaceAll()
wird vorgeschlagen , wann immer möglich.Für einfache Substitutionen, wie Sie sie erwähnt haben, ist es beispielsweise besser, Folgendes zu verwenden:
anstatt:
Hinweis: Die obigen Argumente für die Konvertierungsmethode sind systemabhängig.
quelle
Pattern.compile(...)
Inhalt / Teil in ihren Implementierungen erscheinen, scheintreplace
es weniger komplex zu sein, wie das erste Argument definiert / gesendet wird. Es erfordert nicht"\"
. Darüber hinausreplace
ist seit Java1.5
undreplaceAll
seit1.4
Gibt eine neue Zeichenfolge zurück, die sich aus dem Ersetzen aller Vorkommen von oldChar in dieser Zeichenfolge durch newChar ergibt.
Ersetzt jeden Teilstring dieser Zeichenfolge, der dem angegebenen regulären Ausdruck entspricht, durch den angegebenen Ersatz.
quelle
Es ist nicht wahr, dass replace () schneller funktioniert als replaceAll (), da beide in ihrer Implementierung denselben Code verwenden
Pattern.compile (Regex) .matcher (this) .replaceAll (Ersatz);
Nun stellt sich die Frage, wann replace und wann replaceAll () verwendet werden sollen. Wenn Sie einen Teilstring unabhängig von seinem Ort in der Zeichenfolge durch einen anderen Teilstring ersetzen möchten, verwenden Sie replace (). Wenn Sie jedoch eine bestimmte Präferenz oder Bedingung haben, z. B. nur die Teilzeichenfolgen am Anfang oder Ende einer Zeichenfolge ersetzen, verwenden Sie replaceAll (). Hier sind einige Beispiele, um meinen Standpunkt zu belegen:
quelle
replace
stellt nichtPattern.compile(regex).matcher(this).replaceAll(replacement);
. Es ruftPattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
Wie in der Antwort von wickeD erwähnt, wird bei replaceAll die Ersetzungszeichenfolge zwischen replace und replaceAll unterschiedlich behandelt. Ich habe erwartet, dass a [3] und a [4] den gleichen Wert haben, aber sie sind unterschiedlich.
Die Ausgabe davon ist:
Dies unterscheidet sich von Perl, bei dem für den Austausch keine zusätzliche Fluchtstufe erforderlich ist:
welches \ X 2 druckt
Dies kann ein ziemliches Ärgernis sein, wenn Sie versuchen, den von java.sql.DatabaseMetaData.getSearchStringEscape () mit replaceAll () zurückgegebenen Wert zu verwenden.
quelle
Alter Thread, den ich kenne, aber ich bin ein bisschen neu in Java und entdecke eines seiner seltsamen Dinge. Ich habe verwendet,
String.replaceAll()
aber unvorhersehbare Ergebnisse erhalten.So etwas bringt die Saite durcheinander:
Also habe ich diese Funktion entwickelt, um das seltsame Problem zu umgehen:
Was Sie dazu in der Lage macht:
quelle
String.replaceAll()
erwartet reguläre Ausdrücke, keine wörtlichen Argumente, weshalb Sie "unvorhersehbare" (wirklich sehr vorhersehbare) Ergebnisse erhalten.String.replace()
funktioniert wie du willst.Das Hinzufügen zu der bereits ausgewählten "besten Antwort" (und anderen, die genauso gut sind wie die von Suragch)
String.replace()
wird durch das Ersetzen von Zeichen eingeschränkt, die sequentiell sind (also nehmenCharSequence
). EsString.replaceAll()
ist jedoch nicht darauf beschränkt, nur aufeinanderfolgende Zeichen zu ersetzen. Sie können nicht-sequentielle Zeichen ersetzen, solange Ihr regulärer Ausdruck so aufgebaut ist.Auch (am wichtigsten und schmerzlich offensichtlich)
replace()
kann nur wörtliche Werte ersetzen; wohingegenreplaceAll
"ähnliche" Sequenzen ersetzen können (nicht unbedingt identisch).quelle
replace()
Die Methode verwendet kein Regex-Muster, während diereplaceAll()
Methode das Regex-Muster verwendet. Also gehtreplace()
schneller alsreplaceAll()
.quelle
replace funktioniert mit dem Datentyp char, aber replaceAll funktioniert mit dem Datentyp String und beide ersetzen alle Vorkommen des ersten Arguments durch das zweite Argument.
quelle