Maison > Java > javaDidacticiel > Pourquoi `String.replaceAll(\'.*\', \'a\')` donne-t-il \'aa\' au lieu de \'a\' ?

Pourquoi `String.replaceAll(\'.*\', \'a\')` donne-t-il \'aa\' au lieu de \'a\' ?

Linda Hamilton
Libérer: 2024-10-31 09:28:29
original
824 Les gens l'ont consulté

Why does `String.replaceAll(

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>
Copier après la connexion

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 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