Obtenir la sous-chaîne de String en Java

Obtenir une sous-chaîne de String en Java

1. Vue d'ensemble

Dans ce didacticiel, nous allons découvrir comment obtenir une sous-chaîne à partir d'unString en Java.

Nous utiliserons principalement les méthodes de la classeString et quelques-unes de la classeStringUtils d'Apache Commons.

Dans tous les exemples sur lesquels nous allons travailler:

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

2. Dépendances Maven

Afin d'utiliser la classeStringUtils qui fait partie de la bibliothèqueApache Commons Lang, nous devons ajouter la dépendance suivante dans le projet Maven:


    org.apache.commons
    commons-lang3
    3.8

Vous pouvez trouver la dernière version de cette bibliothèquehere.

3. Utilisation desubstring

C'est la méthode la plus fréquemment utilisée pour extraire une sous-chaîne. Vous pouvez fournir un index de début et un index de fin facultatif pour extraire les caractères intermédiaires.

Si nous ne spécifions pas l’index de fin, la sous-chaîne se trouvera jusqu’à la fin desString.

Considérons que nous voulons extraire le pays de résidence de Julia:

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

Pour supprimer le point à la fin du résultat, nous pouvons utiliser la version légèrement modifiée de la même méthode:

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.

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

Dans le cas où la position doit être calculée dynamiquement sur la base d'un caractère ouString, nous pouvons utiliser la méthodeindexOf:

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 estlastIndexOf. UtilisonslastIndexOf pour extraire l’année "1984". C'est la portion de texte entre le dernier tiret et le premier point:

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

LesindexOf etlastIndexOf peuvent prendre un caractère ou unString comme 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));

4. Utilisation desubSequence

La classeString fournit une autre méthode appeléesubSequence qui agit de manière similaire à la méthodesubstring.

La seule différence est qu'il renvoie unCharSequence au lieu d'unString et il ne peut être utilisé qu'avec un index de début et de fin spécifique:

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

5. Utiliser des expressions régulières

Les expressions régulières viendront à notre secoursif we have to extract a substring that matches a specific pattern.

Dans l'exempleString,, 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 motif 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 lesString: correspondants

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

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

6. Utilisation desplit

Nous pouvons utiliser la méthodesplit de la classeString pour extraire une sous-chaîne. Disons que nous voulons extraire la première phrase de l'exempleString. C'est assez facile à faire en utilisantsplit:

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

Comme la méthode split accepte les expressions rationnelles, nous avons dû échapper au caractère de la période. Maintenant, le résultat est un tableau de 2 phrases.

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

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

Notez qu'il existe de meilleures méthodes de détection de phrase et de création de jetons avec Apache OpenNLP. Consultez le didacticielthis pour en savoir plus sur l'API OpenNLP.

7. Utilisation deScanner

Nous utilisons généralementScanner pour analyser les types primitifs etStrings en utilisant des expressions régulières. A Scanner breaks its input into tokens using a delimiter pattern, qui correspond par défaut aux espaces.

Voyons comment l'utiliser pour extraire la première phrase de l'exemple de texte:

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

Dans l'exemple ci-dessus, nous avons défini l'exempleString comme source à utiliser par le scanner.

Ensuite, nous définissons le caractère de période comme délimiteur (ce qui doit être évité sinon il sera traité comme le caractère spécial d'expression régulière dans ce contexte).

Enfin, nous affirmons le premier jeton à partir de cette sortie délimitée.

Si nécessaire, nous pouvons parcourir la collection complète de jetons en utilisant une bouclewhile.

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

8. Utilisation deStringUtils

Les bibliothèques Apache Commons ajoutent des méthodes utiles pour manipuler les types Java principaux. Apache Commons Lang fournit une foule d'utilitaires d'assistance pour l'API java.lang, notamment les méthodes de manipulationString.

Dans cet exemple, nous allons voirhow to extract a substring nested between two Strings:

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

Il existe une version simplifiée de cette méthode au cas où la sous-chaîne est imbriquée entre deux instances du mêmeString:

substringBetween(String str, String tag)

La méthodesubstringAfter de la même classe obtient la sous-chaîne après la première occurrence d'un séparateur.

Le séparateur n’est pas renvoyé:

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

De même, la méthodesubstringBefore obtient la sous-chaîne avant la première occurrence d'un séparateur.

Le séparateur n’est pas renvoyé:

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

Vous pouvez consulter ce tutoriel pour en savoir plus sur le traitement deString à 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'unString en Java. Vous pouvez explorer nosother tutorials sur la manipulation deString en Java.

Comme toujours, des extraits de code peuvent être trouvésover on GitHub.