"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi \"test\".replaceAll(\".\", \"a\") donne-t-il \"aa\" en Java ?

Pourquoi \"test\".replaceAll(\".\", \"a\") donne-t-il \"aa\" en Java ?

Publié le 2024-11-10
Parcourir:605

Why Does \

Anomalie String ReplaceAll : double remplacement par ".*"

En Java, la méthode String.replaceAll() effectue une recherche globale et remplacer l'opération sur une chaîne donnée à l'aide d'une expression régulière. Cependant, un comportement inattendu survient lors de l'utilisation du modèle d'expression régulière ".*", entraînant un problème de double remplacement.

La question pose un scénario dans lequel "test".replaceAll(".", "a ") donne "aa" comme résultat. En effet, . est un quantificateur glouton qui correspond à n'importe quel nombre de caractères (y compris zéro), capturant initialement la totalité de la chaîne d'entrée. Par conséquent, le premier remplacement remplace la chaîne entière par « a ».

Cependant, . peut également correspondre à une chaîne vide. Après le remplacement initial, la chaîne vide restant à la fin de l'entrée est également considérée comme une correspondance pour .. Ainsi, un deuxième remplacement se produit, remplaçant la chaîne vide par « a », ce qui donne le résultat final « aa ».

Pour éviter ce problème de double remplacement, envisagez des alternatives à .* telles que . , ce qui nécessite au moins un caractère pour correspondre. Alternativement, l'utilisation de replaceFirst() ne remplacera que la première occurrence, évitant ainsi la situation où une chaîne vide correspond une deuxième fois.

Fait intéressant, certains moteurs d'expressions régulières ne présentent pas ce comportement de double remplacement. Par exemple, GNU sed considérera l'entrée comme épuisée après la première correspondance, empêchant ainsi tout remplacement ultérieur. Cependant, il est crucial d'être conscient de cette anomalie potentielle lors de l'utilisation de ".*" avec la méthode String.replaceAll() en Java.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3