Antworten:
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.
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, warum String#replace
schneller als wäre String#replaceAll
? Es scheint nicht so, da String#replace
nur zusätzliche Operationen ausgeführt werden.
replaceAll
. Die Antwort ist mehr überreplace
F: Was ist der Unterschied zwischen den java.lang.String
Methoden replace()
und replaceAll()
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)
CharSequence
. Beides replace()
und replaceAll()
"arbeiten mit CharSequence
". Es ist , dass replaceAll()
die gegebene Auffassung CharSequence
als regulärer Ausdruck , so dass es für aussieht Regex -Übereinstimmungen , während replace()
der gegebenen betrachtet CharSequence
als einfachen Suchtext , so dass es für aussieht Vorkommen davon.
Beides replace()
und replaceAll()
alle Vorkommen in der Zeichenfolge ersetzen.
Ich finde immer Beispiele hilfreich, um die Unterschiede zu verstehen.
replace()
Verwenden replace()
Sie diese Option, wenn Sie nur einige char
durch andere char
oder String
andere String
(tatsächlich CharSequence
) durch andere ersetzen möchten .
Beispiel 1
Ersetzen Sie alle Vorkommen des Charakters x
durch o
.
String myString = "__x___x___x_x____xx_";
char oldChar = 'x';
char newChar = 'o';
String newString = myString.replace(oldChar, newChar);
// __o___o___o_o____oo_
Beispiel 2
Ersetzen Sie alle Vorkommen der Zeichenfolge fish
durch sheep
.
String myString = "one fish, two fish, three fish";
String target = "fish";
String replacement = "sheep";
String newString = myString.replace(target, replacement);
// one sheep, two sheep, three sheep
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
.
String myString = "__1_6____3__6_345____0";
String regex = "\\d";
String replacement = "x";
String newString = myString.replaceAll(regex, replacement);
// __x_x____x__x_xxx____x
Beispiel 4
Entfernen Sie alle Leerzeichen.
String myString = " Horse Cow\n\n \r Camel \t\t Sheep \n Goat ";
String regex = "\\s";
String replacement = "";
String newString = myString.replaceAll(regex, replacement);
// HorseCowCamelSheepGoat
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
Die replace()
Methode ist überladen, um sowohl ein Grundelement char
als auch ein CharSequence
als Argumente zu akzeptieren .
Was die Leistung betrifft, ist die replace()
Methode etwas schneller als replaceAll()
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()
über replaceAll()
wird vorgeschlagen , wann immer möglich.
Für einfache Substitutionen, wie Sie sie erwähnt haben, ist es beispielsweise besser, Folgendes zu verwenden:
replace('.', '\\');
anstatt:
replaceAll("\\.", "\\\\");
Hinweis: Die obigen Argumente für die Konvertierungsmethode sind systemabhängig.
Pattern.compile(...)
Inhalt / Teil in ihren Implementierungen erscheinen, scheint replace
es weniger komplex zu sein, wie das erste Argument definiert / gesendet wird. Es erfordert nicht "\"
. Darüber hinaus replace
ist seit Java 1.5
und replaceAll
seit1.4
String replace(char oldChar, char newChar)
Gibt eine neue Zeichenfolge zurück, die sich aus dem Ersetzen aller Vorkommen von oldChar in dieser Zeichenfolge durch newChar ergibt.
String replaceAll(String regex, String replacement
Ersetzt jeden Teilstring dieser Zeichenfolge, der dem angegebenen regulären Ausdruck entspricht, durch den angegebenen Ersatz.
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:
String str = new String("==qwerty==").replaceAll("^==", "?"); \\str: "?qwerty=="
String str = new String("==qwerty==").replaceAll("==$", "?"); \\str: "==qwerty?"
String str = new String("===qwerty==").replaceAll("(=)+", "?"); \\str: "?qwerty?"
replace
stellt nicht Pattern.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.
public static void main(String[] args) {
String[] a = new String[5];
a[0] = "\\";
a[1] = "X";
a[2] = a[0] + a[1];
a[3] = a[1].replaceAll("X", a[0] + "X");
a[4] = a[1].replace("X", a[0] + "X");
for (String s : a) {
System.out.println(s + "\t" + s.length());
}
}
Die Ausgabe davon ist:
\ 1
X 1
\X 2
X 1
\X 2
Dies unterscheidet sich von Perl, bei dem für den Austausch keine zusätzliche Fluchtstufe erforderlich ist:
#!/bin/perl
$esc = "\\";
$s = "X";
$s =~ s/X/${esc}X/;
print "$s " . length($s) . "\n";
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.
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:
sUrl = sUrl.replaceAll( "./", "//").replaceAll( "//", "/");
Also habe ich diese Funktion entwickelt, um das seltsame Problem zu umgehen:
//String.replaceAll does not work OK, that's why this function is here
public String strReplace( String s1, String s2, String s )
{
if((( s == null ) || (s.length() == 0 )) || (( s1 == null ) || (s1.length() == 0 )))
{ return s; }
while( (s != null) && (s.indexOf( s1 ) >= 0) )
{ s = s.replace( s1, s2 ); }
return s;
}
Was Sie dazu in der Lage macht:
sUrl=this.strReplace("./", "//", sUrl );
sUrl=this.strReplace( "//", "/", sUrl );
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 nehmen CharSequence
). Es String.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; wohingegen replaceAll
"ähnliche" Sequenzen ersetzen können (nicht unbedingt identisch).
replace()
Die Methode verwendet kein Regex-Muster, während die replaceAll()
Methode das Regex-Muster verwendet. Also geht replace()
schneller als replaceAll()
.
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.
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.