Reguläre Ausdrücke \ s und \ s + in Java

1. Übersicht

Das Ersetzen von Zeichenfolgen ist eine Standardoperation, wenn Zeichenfolgen in Java verarbeitet werden.

Dank der praktischen Methode replaceAll () in der String- Klasse können wir problemlos Zeichenfolgen durch reguläre Ausdrücke ersetzen. Manchmal können die Ausdrücke jedoch verwirrend sein, z. B. \ s und \ s +.

In diesem kurzen Tutorial werden wir anhand von Beispielen den Unterschied zwischen den beiden regulären Ausdrücken untersuchen.

2. Der Unterschied zwischen \ s und \ s +

Der reguläre Ausdruck \ s ist eine vordefinierte Zeichenklasse. Es zeigt ein einzelnes Leerzeichen an. Sehen wir uns die Leerzeichen an:

[ \t\n\x0B\f\r]

Das Pluszeichen + ist ein gieriger Quantifizierer, dh einmal oder mehrmals. Beispielsweise entspricht der Ausdruck X + einem oder mehreren X- Zeichen.

Daher der reguläre Ausdruck \ s entspricht einem einzelnen Leerzeichen, während \ wird s + ein oder mehrere Leerzeichen entsprechen.

3. replaceAll () durch einen nicht leeren Ersatz

Wir haben die Bedeutung der regulären Ausdrücke \ s und \ s + gelernt .

Schauen wir uns nun an, wie sich die replaceAll () -Methode bei diesen beiden regulären Ausdrücken unterschiedlich verhält.

Wir werden eine Zeichenfolge als Eingabetext für alle Beispiele verwenden:

String INPUT_STR = "Text With Whitespaces! ";

Versuchen wir, \ s als Argument an die replaceAll () -Methode zu übergeben:

String result = INPUT_STR.replaceAll("\\s", "_"); assertEquals("Text___With_____Whitespaces!___", result);

Die Methode replaceAll () findet einzelne Leerzeichen und ersetzt jede Übereinstimmung durch einen Unterstrich. Wir haben elf Leerzeichen im Eingabetext. Somit werden elf Ersetzungen auftreten.

Als nächstes übergeben wir den regulären Ausdruck \ s + an die Methode replaceAll () :

String result = INPUT_STR.replaceAll("\\s+", "_"); assertEquals("Text_With_Whitespaces!_", result);

Aufgrund der gierigen Quantifizierer + , die replaceAll () wird Verfahren die längste Sequenz von aufeinanderfolgenden Leerzeichen entspricht und jede Übereinstimmung mit einem Unterstrich ersetzen.

In unserem Eingabetext haben wir drei Sequenzen zusammenhängender Leerzeichen. Daher wird jeder der drei ein Unterstrich.

4. replaceAll () durch einen leeren Ersatz

Eine andere häufige Verwendung der replaceAll () -Methode besteht darin, übereinstimmende Muster aus dem Eingabetext zu entfernen. Wir tun dies normalerweise, indem wir eine leere Zeichenfolge als Ersatz für die Methode übergeben.

Mal sehen, welches Ergebnis wir erhalten, wenn wir Leerzeichen mit der Methode replaceAll () mit dem regulären Ausdruck \ s entfernen :

String result1 = INPUT_STR.replaceAll("\\s", ""); assertEquals("TextWithWhitespaces!", result1);

Jetzt übergeben wir den anderen regulären Ausdruck \ s + an die replaceAll () -Methode:

String result2 = INPUT_STR.replaceAll("\\s+", ""); assertEquals("TextWithWhitespaces!", result2); 

Da es sich bei der Ersetzung um eine leere Zeichenfolge handelt, führen die beiden Aufrufe von replaceAll () zum gleichen Ergebnis, obwohl die beiden regulären Ausdrücke unterschiedliche Bedeutungen haben:

assertEquals(result1, result2);

Wenn wir die beiden replaceAll () -Aufrufe vergleichen, ist der mit \ s + effizienter. Dies liegt daran, dass es die Arbeit mit nur drei Ersetzungen erledigt, während der Anruf mit \ s elf Ersetzungen erledigt .

5. Schlussfolgerung

In diesem kurzen Artikel haben wir die regulären Ausdrücke \ s und \ s + kennengelernt .

Wir haben auch gesehen, wie sich die replaceAll () -Methode bei den beiden Ausdrücken unterschiedlich verhält .

Wie immer ist der Code auf GitHub verfügbar.