Ottieni sottostringa da stringa in Java

1. Panoramica

In questo breve tutorial, ci concentreremo sulla funzionalità della sottostringa di stringhe in Java.

Useremo principalmente i metodi della classe String e pochi della classe StringUtils di Apache Commons .

In tutti i seguenti esempi, useremo questa semplice stringa:

String text = "Julia Evans was born on 25-09-1984. " + "She is currently living in the USA (United States of America).";

2. Nozioni di base sulla sottostringa

Cominciamo con un esempio molto semplice qui: estrarre una sottostringa con l'indice di inizio:

assertEquals("USA (United States of America).", text.substring(67));

Nota come abbiamo estratto il paese di residenza di Julia nel nostro esempio qui.

C'è anche un'opzione per specificare un indice di fine , ma senza di esso - la sottostringa andrà fino alla fine della stringa.

Facciamolo e sbarazziamoci di quel punto in più alla fine, nell'esempio sopra:

assertEquals("USA (United States of America)", text.substring(67, text.length() - 1));

Negli esempi precedenti, abbiamo utilizzato la posizione esatta per estrarre la sottostringa.

2.1. Ottenere una sottostringa a partire da un carattere specifico

Nel caso in cui la posizione debba essere calcolata dinamicamente in base a un carattere o una stringa, possiamo utilizzare il metodo indexOf :

assertEquals("United States of America", text.substring(text.indexOf('(') + 1, text.indexOf(')')));

Un metodo simile che può aiutarci a individuare la nostra sottostringa è lastIndexOf . Usiamo lastIndexOf per estrarre l'anno "1984". È la porzione di testo tra l'ultimo trattino e il primo punto:

assertEquals("1984", text.substring(text.lastIndexOf('-') + 1, text.indexOf('.')));

Sia indexOf e lastIndexOf può prendere un carattere o una stringa come parametro. Estraiamo il testo "USA" e il resto del testo tra parentesi:

assertEquals("USA (United States of America)", text.substring(text.indexOf("USA"), text.indexOf(')') + 1));

3. Utilizzo di subSequence

La classe String fornisce un altro metodo chiamato subSequence che agisce in modo simile al metodo della sottostringa .

L'unica differenza è che restituisce un CharSequence invece di una String e può essere utilizzato solo con un indice iniziale e finale specifico:

assertEquals("USA (United States of America)", text.subSequence(67, text.length() - 1));

4. Utilizzo di espressioni regolari

Le espressioni regolari verranno in nostro soccorso se dobbiamo estrarre una sottostringa che corrisponde a un modello specifico.

Nell'esempio String, la data di nascita di Julia è nel formato "gg-mm-aaaa". Possiamo abbinare questo modello utilizzando l'API delle espressioni regolari Java.

Prima di tutto, dobbiamo creare un modello per "gg-mm-aaaa":

Pattern pattern = Pattern.compile("\\d{2}-\\d{2}-\\d{4}");

Quindi, applicheremo il modello per trovare una corrispondenza dal testo dato:

Matcher matcher = pattern.matcher(text);

In caso di corrispondenza riuscita possiamo estrarre la stringa corrispondente :

if (matcher.find()) { Assert.assertEquals("25-09-1984", matcher.group()); }

Per maggiori dettagli sulle espressioni regolari Java, guarda questo tutorial.

5. Utilizzo di split

Possiamo usare il metodo split della classe String per estrarre una sottostringa. Supponiamo di voler estrarre la prima frase dall'esempio String. Questo è abbastanza facile da fare usando la divisione :

String[] sentences = text.split("\\.");

Poiché il metodo split accetta un'espressione regolare, abbiamo dovuto eseguire l'escape del carattere punto. Ora il risultato è un array di 2 frasi.

Possiamo usare la prima frase (o iterare attraverso l'intero array):

assertEquals("Julia Evans was born on 25-09-1984", sentences[0]);

Tieni presente che esistono modi migliori per il rilevamento e la tokenizzazione delle frasi utilizzando Apache OpenNLP. Dai un'occhiata a questo tutorial per saperne di più sull'API OpenNLP.

6. Utilizzo dello scanner

Generalmente utilizziamo Scanner per analizzare tipi primitivi e stringhe utilizzando espressioni regolari. Uno Scanner suddivide il suo input in token utilizzando un modello delimitatore , che per impostazione predefinita corrisponde agli spazi.

Scopriamo come usarlo per ottenere la prima frase dal testo di esempio:

try (Scanner scanner = new Scanner(text)) { scanner.useDelimiter("\\."); assertEquals("Julia Evans was born on 25-09-1984", scanner.next()); }

Nell'esempio precedente, abbiamo impostato la stringa di esempio come origine da utilizzare per lo scanner.

Quindi stiamo impostando il carattere punto come delimitatore (che deve essere sottoposto a escape altrimenti verrà trattato come il carattere di espressione regolare speciale in questo contesto).

Infine, affermiamo il primo token da questo output delimitato.

Se necessario, possiamo iterare attraverso la raccolta completa di token utilizzando un ciclo while .

while (scanner.hasNext()) { // do something with the tokens returned by scanner.next() }

7. Dipendenze di Maven

Possiamo andare un po 'oltre e utilizzare un'utile utility, la classe StringUtils , parte della libreria Apache Commons Lang:

 org.apache.commons commons-lang3 3.8 

Puoi trovare l'ultima versione di questa libreria qui.

8. Utilizzo di StringUtils

The Apache Commons libraries add some useful methods for manipulating core Java types. Apache Commons Lang provides a host of helper utilities for the java.lang API, most notably String manipulation methods.

In this example, we're going to see how to extract a substring nested between two Strings:

assertEquals("United States of America", StringUtils.substringBetween(text, "(", ")"));

There is a simplified version of this method in case the substring is nested in between two instances of the same String:

substringBetween(String str, String tag)

The substringAfter method from the same class gets the substring after the first occurrence of a separator.

The separator isn't returned:

assertEquals("the USA (United States of America).", StringUtils.substringAfter(text, "living in "));

Similarly, the substringBefore method gets the substring before the first occurrence of a separator.

The separator isn't returned:

assertEquals("Julia Evans", StringUtils.substringBefore(text, " was born"));

Puoi dare un'occhiata a questo tutorial per saperne di più sull'elaborazione di stringhe utilizzando Apache Commons Lang API.

9. Conclusione

In questo rapido articolo, abbiamo scoperto vari modi per estrarre una sottostringa da una stringa in Java. Puoi esplorare i nostri altri tutorial sulla manipolazione delle stringhe in Java.

Come sempre, gli snippet di codice possono essere trovati su GitHub.