7
votes

Remplacer une chaîne avec l'expression régulière ". *" Retourne le remplacement deux fois

donné ce code: xxx

pourquoi remplacé contient la chaîne hihi au lieu de hi J'aurais deviné? Il semble que cela ait quelque chose à voir avec le début d'une ligne depuis l'utilisation du modèle ^. * rendements hi , mais je n'ai pas la raison pour cela. < / p>


1 commentaires

Vous pouvez utiliser . + pour empêcher la chaîne vide ( "" ) à correspondre.


4 Réponses :


5
votes

Regardez le remplacementAll Javadoc: remplace chaque sous-chaîne de cette chaîne correspondant à l'expression régulière donnée avec le remplacement donné. Cela correspond à deux sous-chaînes: "" et "A". Vous pouvez voir cela en testant xxx

qui entraîne une seule "HI" étant imprimée


4 commentaires

Dans "A", il y a deux positions (entre les lettres de manière à dire): 0 et 1. à 0 "A" correspond à 1 "" matchs "".


@Joopeggen De toute façon, il est contre-intuitif. Si . * est gourmand, il devrait "manger" de la chaîne entière y compris la chaîne vide à la fin et renvoyer une correspondance une fois.


Deux chaînes vides "a" .replaceall ("", "hi") == hiahi


@Adamdyga "gourmand" (chaîne la plus longue correspondante) à la position 0, mais en position 1, il commence à faire correspondre à nouveau.



5
votes

i pense c'est parce que . * correspond à la chaîne entière, puis correspond à la chaîne vide à la fin de la chaîne. Bien sûr, ^. * ne correspond pas à la chaîne vide à la fin de "A", de sorte que vous vous retrouvez avec un seul "salut".


0 commentaires

0
votes

La méthode de recherche de la classe de correspondance trouve "A" et une chaîne vide après le "A", donc il y a 2 remplacements.


0 commentaires

0
votes

La méthode de remplacement code> prend la réégalité et le paramètre de remplacement similaires ( En savoir plus ): -

String replaced = "A".replaceAll(".*", "HI");


0 commentaires