Maison >Java >javaDidacticiel >Pourquoi String.replaceAll(\'.*\', \'a\') donne-t-il \'aa\' en Java ?
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!