Espressioni regolari \ se \ s + in Java

1. Panoramica

La sostituzione delle stringhe è un'operazione standard quando elaboriamo le stringhe in Java.

Grazie al pratico metodo replaceAll () nella classe String , possiamo facilmente sostituire le stringhe con espressioni regolari. Tuttavia, a volte le espressioni possono essere fonte di confusione, per esempio, \ s e \ s +.

In questo breve tutorial, daremo uno sguardo alla differenza tra le due espressioni regolari attraverso esempi.

2. La differenza tra \ s e \ s +

L'espressione regolare \ s è una classe di caratteri predefinita. Indica un singolo carattere di spazio bianco. Rivediamo il set di caratteri di spazio bianco:

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

Il segno più + è un quantificatore avido, il che significa una o più volte. Ad esempio, l'espressione X + corrisponde a uno o più X caratteri.

Pertanto, l'espressione regolare \ s corrisponde a un singolo carattere di spazio bianco, mentre \ s + corrisponderà a uno o più caratteri di spazio vuoto.

3. replaceAll () con una sostituzione non vuota

Abbiamo imparato il significato delle espressioni regolari \ s e \ s + .

Ora, diamo un'occhiata a come il metodo replaceAll () si comporta in modo diverso con queste due espressioni regolari.

Useremo una stringa come testo di input per tutti gli esempi:

String INPUT_STR = "Text With Whitespaces! ";

Proviamo a passare \ s al metodo replaceAll () come argomento:

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

Il metodo replaceAll () trova singoli caratteri di spazio vuoto e sostituisce ogni corrispondenza con un trattino basso. Abbiamo undici caratteri di spazio bianco nel testo di input. Pertanto, si verificheranno undici sostituzioni.

Successivamente, passiamo l'espressione regolare \ s + al metodo replaceAll () :

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

A causa del quantificatore avido + , il metodo replaceAll () corrisponderà alla sequenza più lunga di caratteri di spazi bianchi contigui e sostituirà ogni corrispondenza con un trattino basso.

Nel nostro testo di input, abbiamo tre sequenze di caratteri di spazio bianco contigui. Pertanto, ciascuno dei tre diventerà un carattere di sottolineatura.

4. replaceAll () con una sostituzione vuota

Un altro utilizzo comune del metodo replaceAll () è rimuovere i modelli corrispondenti dal testo di input. Di solito lo facciamo passando una stringa vuota in sostituzione del metodo.

Vediamo quale risultato otterremo se rimuoviamo gli spazi vuoti usando il metodo replaceAll () con l' espressione regolare \ s :

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

Ora, passeremo l'altra espressione regolare \ s + al metodo replaceAll () :

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

Poiché la sostituzione è una stringa vuota, le due chiamate a replaceAll () producono lo stesso risultato, anche se le due espressioni regolari hanno significati diversi:

assertEquals(result1, result2);

Se confrontiamo le due chiamate a replaceAll () , quella con \ s + è più efficiente. Questo perché fa il lavoro con solo tre sostituzioni mentre la chiamata con \ s eseguirà undici sostituzioni.

5. conclusione

In questo breve articolo, abbiamo imparato a conoscere le espressioni regolari \ s e \ s + .

Abbiamo anche visto come il metodo replaceAll () si è comportato in modo diverso con le due espressioni.

Come sempre, il codice è disponibile su GitHub.