Maison  >  Article  >  Java  >  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
Linda Hamiltonoriginal
2024-11-01 00:35:02622parcourir

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>

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>

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!

Déclaration:
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