Antworten:
Das erste entspricht einem einzelnen Leerzeichen, während das zweite einem oder mehreren Leerzeichen entspricht. Sie sind die sogenannten Quantifizierer für reguläre Ausdrücke und führen Übereinstimmungen wie diese durch (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
Diese beiden replaceAll
Aufrufe führen immer zum gleichen Ergebnis, unabhängig davon, was es 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 der Reihenfolge eines oder mehrerer Leerzeichen.In diesem Fall macht es keinen Unterschied, da Sie alles durch eine leere Zeichenfolge ersetzen (obwohl es \\s+
aus Effizienzgründen besser wäre, sie zu verwenden ). Wenn Sie durch eine nicht leere Zeichenfolge ersetzen würden, würden sich die beiden unterschiedlich verhalten.
Zunächst müssen Sie verstehen, dass die endgültige Ausgabe beider Anweisungen identisch ist, dh um alle Leerzeichen aus der angegebenen Zeichenfolge zu entfernen.
Dies x.replaceAll("\\s+", "");
ist jedoch eine effizientere Methode zum Trimmen von Leerzeichen (wenn die Zeichenfolge mehrere zusammenhängende Leerzeichen enthalten kann), da möglicherweise weniger Ersetzungen erforderlich sind, da Regex \\s+
mit einem oder mehreren Leerzeichen gleichzeitig übereinstimmt und diese durch leere Zeichenfolgen ersetzt.
Obwohl Sie von beiden die gleiche Ausgabe erhalten, ist es besser, Folgendes zu verwenden:
x.replaceAll("\\s+", "");
Der erste reguläre Ausdruck entspricht einem Leerzeichen. Die zweite Regex stimmt nur ungern mit einem oder mehreren Leerzeichen überein. Für die meisten Zwecke sind diese beiden regulären Ausdrücke sehr ähnlich, außer im zweiten Fall kann der reguläre Ausdruck mehr mit der Zeichenfolge übereinstimmen, wenn dadurch verhindert wird, dass die reguläre Übereinstimmung fehlschlägt. von http://www.coderanch.com/t/570917/java/java/regex-difference
\s+
nicht um \s+?
diese andere Frage.