Comprendre l'anomalie de double remplacement String.replaceAll()
La question se pose de savoir pourquoi le code suivant :
<code class="java">System.out.println("test".replaceAll(".*", "a"));</code>
résulte en "aa" au lieu du "a" attendu. Cette anomalie se produit également lors de l'utilisation de ".*$".
Cause :
L'anomalie découle de la nature de l'expression régulière ".*". Il correspond à n'importe quelle séquence de caractères, y compris une chaîne vide. Par conséquent :
-
Première correspondance : « .* » correspond à la chaîne entière « test » et la remplace par « a ».
-
Deuxième correspondance : « .* » peut également correspondre à une chaîne vide, qu'il trouve à la fin de l'entrée. Cette deuxième correspondance remplace la chaîne vide par "a", ce qui entraîne un double remplacement.
Solution :
Pour éviter ce problème, pensez à utiliser :
-
.replaceFirst() : Remplace uniquement la première occurrence, évitant ainsi le double remplacement.
-
. : Correspond à toute séquence de caractères d'un ou plusieurs caractères, à l'exclusion des chaînes vides.
Comportement Regex :
While .* peut correspondre à une chaîne vide , il ne peut pas correspondre plus de deux fois. En effet :
- Après la première correspondance, le moteur d'expression régulière avance d'un caractère.
- La deuxième correspondance utilise le .* pour faire correspondre la chaîne vide qui se trouve maintenant à la fin. de l'entrée.
- Le moteur d'expression régulière épuise l'entrée et décale un autre caractère vers l'avant.
- Il n'y a plus d'entrée pour .* pour correspondre, empêchant un troisième remplacement.
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