Was ist der Unterschied zwischen den folgenden zwei Ausdrücken?
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
plus
Was ist der Unterschied zwischen den folgenden zwei Ausdrücken?
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
Der erste entspricht einem einzelnen Leerzeichen, während der zweite einem oder mehreren Leerzeichen entspricht. Sie sind die sogenannten Quantifizierer für reguläre Ausdrücke, und sie führen Übereinstimmungen wie diese aus (entnommen aus der Dokumentation):
Greedy quantifiers
X? X, once or not at all
X* X, zero or more times
X+ X, one or more times
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m times
Reluctant quantifiers
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}? X, exactly n times
X{n,}? X, at least n times
X{n,m}? X, at least n but not more than m times
Possessive quantifiers
X?+ X, once or not at all
X*+ X, zero or more times
X++ X, one or more times
X{n}+ X, exactly n times
X{n,}+ X, at least n times
X{n,m}+ X, at least n but not more than m times
Ich habe es immer geliebt, wie sie separate Beschreibungen der gierigen, widerwilligen und besitzergreifenden Versionen jedes Quantors liefern und dann genau das Gleiche über alle drei sagen. 😉
– Alan Moore
25. März 2013 um 22:50 Uhr
arshajii
Diese zwei replaceAll
Aufrufe führen immer zum gleichen Ergebnis, egal was x
ist. Es ist jedoch wichtig zu beachten, dass die beiden regulären Ausdrücke nicht identisch sind:
\\s
– entspricht einem einzelnen Leerzeichen \\s+
– entspricht einer Folge von einem oder mehreren Leerzeichen.In diesem Fall macht es keinen Unterschied, da Sie alles durch eine leere Zeichenfolge ersetzen (obwohl es besser wäre, \\s+
unter Effizienzgesichtspunkten). Wenn Sie durch eine nicht leere Zeichenfolge ersetzen würden, würden sich die beiden anders verhalten.
Wrt Ihre erste Zeile, wenn x “Buchen Sie Ihre Domain und gehen Sie\n \n\n \n \n \n noch heute online.” Werden beide die gleichen Ergebnisse liefern?
– Sofas1
15. Dezember 2016 um 10:01 Uhr
@ user3705478 Beide führen zu denselben Ergebnissen, auch wenn mehrere Leerzeichen hintereinander stehen. Der Unterschied liegt in der Art und Weise, wie es gehandhabt wird. Wenn Sie eine Gruppe von (zum Beispiel) 3 direkt aufeinander folgenden Leerzeichen haben würden, nimmt \\s+ diese Gruppe und verwandelt das Ganze in ein “”, während \\s jedes Leerzeichen selbst verarbeiten würde.
– Denie
4. Januar 2017 um 9:29 Uhr
Zunächst müssen Sie verstehen, dass die endgültige Ausgabe beider Anweisungen gleich ist, dh alle Leerzeichen aus der angegebenen Zeichenfolge zu entfernen.
Jedoch x.replaceAll("\\s+", "");
Dies ist eine effizientere Methode zum Trimmen von Leerzeichen (wenn Zeichenfolge mehrere zusammenhängende Leerzeichen haben kann), da möglicherweise weniger Ersetzungen erforderlich sind, da regex \\s+
stimmt mit 1 oder mehreren Leerzeichen gleichzeitig überein und ersetzt sie durch eine leere Zeichenfolge.
Obwohl Sie also von beiden dieselbe Ausgabe erhalten, ist es besser, Folgendes zu verwenden:
x.replaceAll("\\s+", "");
Die erste Regex entspricht einem Leerzeichen. Die zweite Regex wird widerwillig mit einem oder mehreren Leerzeichen übereinstimmen. Für die meisten Zwecke sind diese beiden Regexen sehr ähnlich, außer dass im zweiten Fall die Regex mehr von der Zeichenfolge abgleichen kann, wenn dies verhindert, dass die Regex-Übereinstimmung fehlschlägt. aus http://www.coderanch.com/t/570917/java/java/regex-difference