Obtenir une sous-chaîne à partir d'une chaîne en Java

1. Vue d'ensemble

Dans ce rapide didacticiel, nous nous concentrerons sur la fonctionnalité de sous-chaîne de Strings en Java.

Nous utiliserons principalement les méthodes de la classe String et quelques-unes de la classe StringUtils d'Apache Commons .

Dans tous les exemples suivants, nous allons utiliser cette chaîne simple:

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

2. Bases de la sous - chaîne

Commençons par un exemple très simple ici - extraire une sous-chaîne avec l'index de départ:

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

Notez comment nous avons extrait le pays de résidence de Julia dans notre exemple ici.

Il existe également une option pour spécifier un index de fin , mais sans lui, la sous - chaîne ira jusqu'à la fin de la chaîne.

Faisons cela et débarrassons-nous de ce point supplémentaire à la fin, dans l'exemple ci-dessus:

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

Dans les exemples ci-dessus, nous avons utilisé la position exacte pour extraire la sous-chaîne.

2.1. Obtenir une sous-chaîne à partir d'un caractère spécifique

Dans le cas où la position doit être calculée dynamiquement en fonction d'un caractère ou d'une chaîne, nous pouvons utiliser la méthode indexOf :

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

Une méthode similaire qui peut nous aider à localiser notre sous-chaîne est lastIndexOf . Utilisons lastIndexOf pour extraire l'année «1984». C'est la partie de texte entre le dernier tiret et le premier point:

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

Les deux indexOf et lastIndexOf peuvent prendre un caractère ou une chaîne en tant que paramètre. Extrayons le texte «USA» et le reste du texte entre parenthèses:

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

3. Utilisation de la sous- séquence

La classe String fournit une autre méthode appelée subSequence qui agit de manière similaire à la méthode substring .

La seule différence est qu'elle renvoie une CharSequence au lieu d'une String et qu'elle ne peut être utilisée qu'avec un index de début et de fin spécifique:

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

4. Utilisation d'expressions régulières

Les expressions régulières viendront à notre secours si nous devons extraire une sous-chaîne qui correspond à un modèle spécifique.

Dans l'exemple String, la date de naissance de Julia est au format «jj-mm-aaaa». Nous pouvons faire correspondre ce modèle à l'aide de l'API d'expression régulière Java.

Tout d'abord, nous devons créer un modèle pour «jj-mm-aaaa»:

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

Ensuite, nous appliquerons le modèle pour trouver une correspondance à partir du texte donné:

Matcher matcher = pattern.matcher(text);

En cas de correspondance réussie, nous pouvons extraire la chaîne correspondante :

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

Pour plus de détails sur les expressions régulières Java, consultez ce didacticiel.

5. Utilisation de la division

Nous pouvons utiliser la méthode split de la classe String pour extraire une sous-chaîne. Disons que nous voulons extraire la première phrase de l'exemple String. C'est assez facile à faire en utilisant split :

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

Puisque la méthode de fractionnement accepte une expression régulière, nous avons dû échapper au caractère de période. Maintenant, le résultat est un tableau de 2 phrases.

Nous pouvons utiliser la première phrase (ou parcourir tout le tableau):

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

Veuillez noter qu'il existe de meilleures façons de détecter et de tokeniser les phrases à l'aide d'Apache OpenNLP. Consultez ce didacticiel pour en savoir plus sur l'API OpenNLP.

6. Utilisation du scanner

Nous utilisons généralement Scanner pour analyser les types primitifs et les chaînes à l' aide d'expressions régulières. Un scanner divise son entrée en jetons à l'aide d'un modèle de délimiteur , qui correspond par défaut aux espaces.

Voyons comment l'utiliser pour obtenir la première phrase du texte d'exemple:

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

In the above example, we have set the example String as the source for the scanner to use.

Then we are setting the period character as the delimiter (which needs to be escaped otherwise it will be treated as the special regular expression character in this context).

Finally, we assert the first token from this delimited output.

If required, we can iterate through the complete collection of tokens using a while loop.

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

7. Maven Dependencies

We can go a bit further and use a useful utility – the StringUtils class – part of the Apache Commons Lang library:

 org.apache.commons commons-lang3 3.8 

You can find the latest version of this library here.

8. Using 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"));

Vous pouvez consulter ce didacticiel pour en savoir plus sur le traitement des chaînes à l' aide de l'API Apache Commons Lang.

9. Conclusion

Dans cet article rapide, nous avons découvert différentes façons d'extraire une sous-chaîne d'une chaîne en Java. Vous pouvez explorer nos autres tutoriels sur la manipulation de chaînes en Java.

Comme toujours, des extraits de code peuvent être trouvés sur GitHub.