Maison > Java > javaDidacticiel > Pourquoi `String.replaceAll(regex)` effectue-t-il plusieurs remplacements lorsque l'expression régulière correspond à tout ?

Pourquoi `String.replaceAll(regex)` effectue-t-il plusieurs remplacements lorsque l'expression régulière correspond à tout ?

Linda Hamilton
Libérer: 2024-11-01 00:35:02
original
734 Les gens l'ont consulté

Why does `String.replaceAll(regex)` perform multiple replacements when the regex matches everything?

Pourquoi String.replaceAll(regex) effectue plusieurs remplacements pour les expressions régulières correspondant à tout

En Java, la méthode String.replaceAll() permet pour le remplacement de toutes les occurrences d'un modèle d'expression régulière par une substitution spécifiée. Cependant, lorsque l'expression régulière correspond à l'intégralité de la chaîne d'entrée, un comportement inattendu peut se produire, entraînant plusieurs remplacements.

Considérez l'exemple présenté :

<code class="java">System.out.println("test".replaceAll(".*", "a"));</code>
Copier après la connexion

Ce code génère "aa" à la place. du "a" attendu. Cette anomalie se produit parce que l'expression régulière .* correspond à n'importe quelle chaîne, y compris une chaîne vide.

Après la correspondance initiale, le moteur d'expression régulière tente de localiser une autre occurrence en commençant par la fin de la saisir. Cependant, .* peut correspondre à une chaîne vide, et cette correspondance se produit à la toute fin de l'entrée. Par conséquent, le moteur d'expression régulière substitue un "a" à cette position vide.

Pour éviter ce comportement et garantir un remplacement unique, pensez à utiliser l'expression .* à la place, qui nécessite que l'expression régulière corresponde à au moins un caractère et ne peut donc pas correspondre à une chaîne vide.

Vous pouvez également utiliser la méthode String.replaceFirst(), qui remplace uniquement la première occurrence de l'expression régulière spécifiée.

Par exemple :

<code class="java">"test".replaceFirst(".*", "a")</code>
Copier après la connexion

Ce code produira le résultat souhaité de "a".

Il convient de mentionner que tous les moteurs d'expressions régulières ne se comportent pas de la même manière concernant plusieurs correspondances. GNU sed, par exemple, considérera l'entrée épuisée après la première correspondance, empêchant tout remplacement ultérieur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal