8 votes

Quel est l'effet de "*" dans les expressions régulières ?

Mon code source Java :

String result = "B123".replaceAll("B*","e");
System.out.println(result);

La sortie est : ee1e2e3e . Pourquoi ?

21voto

Anders Westrup Points 788

* signifie qu'il y a zéro correspondance ou plus avec le caractère précédent. Ainsi, chaque chaîne vide sera remplacée par un "e".

Il est préférable d'utiliser le signe "+" :

replaceAll("B+", "e")

7voto

Daniel Schaffer Points 14707

Vous voulez ça pour votre modèle :

B+

Et votre code serait :

String result = "B123".replaceAll("B+","e");
System.out.println(result);

Le "*" correspond à "zéro ou plus" - et "zéro" inclut le rien qui se trouve avant le B, ainsi qu'entre tous les autres caractères.

1voto

tkotitan Points 2109

J'ai passé plus d'un mois à travailler dans une grande entreprise de technologie à corriger un bogue avec * (splat !) dans les expressions régulières. Nous maintenions un système d'exploitation UNIX peu connu. Ma tête a failli exploser parce que cela correspondait à ZERO occurrences d'une rencontre avec un personnage. Vous parlez d'un bug difficile à comprendre par vos propres recréations. Nous faisions des doubles substitutions dans certains cas. Je n'ai pas pu comprendre pourquoi le code était erroné, mais j'ai pu ajouter du code qui capturait le cas spécial (erroné) et empêchait la double substitution et ne cassait aucun des utilitaires qui l'incluaient (y compris sed et awk). J'étais fier d'avoir corrigé ce bogue, mais comme déjà mentionné.

Pour l'amour de Dieu, utilisez simplement + ! !!!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X