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

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

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 02:51:31917parcourir

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>

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!

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