Supprimer ou remplacer une partie d’une chaîne en Java

Supprimer ou remplacer une partie d'une chaîne en Java

1. Vue d'ensemble

Dans ce didacticiel, nous allons examiner différents moyens de supprimer ou de remplacer une partie d'unString en Java.

Nous allons explorer la suppression et / ou le remplacement d'une sous-chaîne à l'aide d'une APIString, puis en utilisant une APIStringBuilder et enfin en utilisant la classeStringUtils de la bibliothèque Apache Commons.

En prime,we’ll also look into replacing an exact word using the String API and the Apache Commons RegExUtils class.

2. APIString

L'une des méthodes les plus simples et les plus directes de remplacement d'une sous-chaîne consiste à utiliser lereplace, replaceAll orreplaceFirst d'unString class.

La méthodereplace() prend deux arguments - texte cible et texte de remplacement:

String master = "Hello World example!";
String target = "example";
String replacement = "Java";
String processed = master.replace(target, replacement);
assertTrue(processed.contains(replacement));
assertFalse(processed.contains(target));

L'extrait ci-dessus donnera cette sortie:

Hello World Java!

Si une expression régulière est requise pour choisir la cible, alors lesreplaceAll() oureplaceFirst() devraient être la méthode de choix. Comme leur nom l'indique,replaceAll() will remplace chaque occurrence correspondante, tandis que lesreplaceFirst() remplaceront la première occurrence correspondante:

String master2 = "Welcome to example, Hello World example";
String regexTarget = "(example)$";
String processed2 = master2.replaceAll(regexTarget, replacement);
assertTrue(processed2.endsWith("Java"));

La valeur deprocessed2 sera:

Welcome to example, Hello World Java

C'est parce que l'expression régulière fournie en tant queregexTarget ne correspondra qu'à la dernière occurrence deexample. In all examples given above, we can use an empty replacement and it’ll effectively remove a target from a master.

3. APIStringBuilder

Nous pouvons également manipuler du texte en Java en utilisant la classeStringBuilder Les deux méthodes ici sontdelete() etreplace().

Nous pouvons construire une instance d'unStringBuilder  à partir d'unString existant, puis utiliser les méthodes mentionnées pour effectuer la manipulation deString comme souhaité:

String master = "Hello World example!";
String target = "example";
String replacement = "Java";

int startIndex = master.indexOf(target);
int stopIndex = startIndex + target.length();

StringBuilder builder = new StringBuilder(master);

Maintenant, nous pouvons supprimer lestarget avec lesdelete():

builder.delete(startIndex, stopIndex);
assertFalse(builder.toString().contains(target));

Nous pouvons également utiliser lesreplace() pour mettre à jour le maître:

builder.replace(startIndex, stopIndex, replacement);
assertTrue(builder.toString().contains(replacement));

Une différence apparente entre l'utilisation du sableStringBuilder avec l'APIString est que nous devons obtenir nous-mêmes les index de début et d'arrêt destargetString.

4. ClasseStringUtils

Une autre méthode que nous allons considérer est la bibliothèque Apache Commons.

Tout d'abord, ajoutons la dépendance requise à notre projet:


    org.apache.commons
    commons-lang3
    3.8.1

La dernière version de la bibliothèque peut être trouvéehere.

La sclasseStringUtils a des méthodes pour remplacer une sous-chaîne d'unString:

String master = "Hello World example!";
String target = "example";
String replacement = "Java";

String processed = StringUtils.replace(master, target, replacement);
assertTrue(processed.contains(replacement));

Il existe une variante surchargée dureplace() qui prend un paramètre entiermax, qui détermine le nombre d'occurrences à remplacer. We can also use the replaceIgnoreCase() if case-sensitivity is not a concern:

String master2 = "Hello World example!";
String target2 = "example";
String processed2 = StringUtils.replaceIgnoreCase(master2, target2, replacement);
assertFalse(processed2.contains(target));

5. Remplacement de mots exacts

Dans ce dernier exemple,we’ll learn how to replace an exact word inside a String.

Le moyen le plus simple d'effectuer ce remplacement est deusing a regular expression avec des limites de mots.

The word boundary regular expression is . Le fait d'insérer le mot souhaité dans cette expression régulière ne fera correspondre que les occurrences exactes.

Voyons d'abord comment utiliser cette expression régulière avec l'API String:

String sentence = "A car is not the same as a carriage, and some planes can carry cars inside them!";
String regexTarget = "\\bcar\\b";
String exactWordReplaced = sentence.replaceAll(regexTarget, "truck");

La chaîneexactWordReplaced contient:

"A truck is not the same as a carriage, and some planes can carry cars inside them!"

Only the exact word will be replaced. Remarquebackward slash always needs to be escaped lors de l'utilisation d'expressions régulières en Java.

Une autre façon de faire ce remplacement consiste à utiliser la classeRegExUtils de la bibliothèque Apache Commons, qui peut être ajoutée en tant que dépendance comme nous l'avons vu dans la section précédente:

String regexTarget = "\\bcar\\b";
String exactWordReplaced = RegExUtils.replaceAll(sentence, regexTarget, "truck");

Bien que les deux méthodes aboutissent au même résultat, le choix de celle à utiliser dépendra de notre scénario spécifique.

6. Conclusion

En conclusion, nous avons exploré plusieurs façons de supprimer et de remplacer une sous-chaîne en Java. La meilleure méthode à appliquer dépend encore largement de la situation et du contexte actuels.

Comme d'habitude, le code source complet est disponibleover on Github.