Maison > Java > javaDidacticiel > le corps du texte

Pourquoi String.replaceAll(\'.*\', \'a\') donne-t-il \'aa\' en Java ?

Barbara Streisand
Libérer: 2024-10-31 02:51:31
original
805 Les gens l'ont consulté

Why does String.replaceAll(

String.replaceAll(regex) Match Behavior

La curieuse observation que String.replaceAll(".*", "a") résultats dans "aa" soulève des questions sur la nature de l'expression régulière .*.

Matching Anything

.* correspond à n'importe quelle séquence de caractères, même une chaîne vide. Par conséquent, la première correspondance englobe la totalité de la chaîne d'entrée, invitant le moteur d'expression régulière à rechercher les correspondances suivantes en commençant par la fin.

Cependant, .* peut également correspondre à une chaîne vide à la fin de l'entrée. Par conséquent, il trouve une deuxième correspondance et la remplace par un « a », conduisant au résultat « aa ».

Utilisation de . et .replaceFirst()

Pour éviter ce comportement, utilisez . au lieu de cela, car il nécessite au moins un caractère pour correspondre. Vous pouvez également utiliser .replaceFirst() pour limiter le remplacement à la première occurrence.

Explication comportementale

Le fait que .* corresponde à une chaîne vide est particulier et mérite une exploration plus approfondie . Contrairement à la plupart des moteurs d'expression régulière, le moteur d'expression régulière de Java décale un caractère plus loin dans l'entrée après une deuxième correspondance avec .*. Cet écart est évident dans l'illustration suivante :

<code class="text"># Before first run
regex: |.*
input: |whatever
# After first run
regex: .*|
input: whatever|
# Before second run
regex: |.*
input: whatever|
# After second run: since .* can match an empty string, it is satisfied...
regex: .*|
input: whatever|
# However, this means the regex engine matched an empty input.
# All regex engines, in this situation, will shift
# one character further in the input.
# So, before third run, the situation is:
regex: |.*
input: whatever<|ExhaustionOfInput>
# Nothing can ever match here: out</code>
Copier après la connexion

Cependant, il convient de noter que d'autres moteurs d'expressions régulières comme GNU sed considèrent l'entrée épuisée après la première correspondance.

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!

source:php.cn
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!