Maison  >  Article  >  Java  >  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
Linda Hamiltonoriginal
2024-10-31 09:28:29656parcourir

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>

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