Quelle est la différence entre les deux expressions suivantes ?
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
Quelle est la différence entre les deux expressions suivantes ?
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
La première correspond à un seul espace, tandis que la seconde correspond à un ou plusieurs espaces. Il s'agit de ce que l'on appelle les quantificateurs d'expressions régulières, qui effectuent des correspondances de la manière suivante (tirée de la page d'accueil de l'éditeur) documentation ) :
Greedy quantifiers
X? X, once or not at all
X* X, zero or more times
X+ X, one or more times
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m times
Reluctant quantifiers
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}? X, exactly n times
X{n,}? X, at least n times
X{n,m}? X, at least n but not more than m times
Possessive quantifiers
X?+ X, once or not at all
X*+ X, zero or more times
X++ X, one or more times
X{n}+ X, exactly n times
X{n,}+ X, at least n times
X{n,m}+ X, at least n but not more than m times
Ces deux replaceAll
produiront toujours le même résultat, quelle que soit la nature de l'appel. x
est. Toutefois, il est important de noter que les deux expressions régulières ne sont pas les mêmes :
\\s
- correspond à un seul caractère d'espacement\\s+
- correspond à une séquence d'un ou plusieurs caractères d'espacement.Dans ce cas, cela ne fait aucune différence, puisque vous remplacez tout par une chaîne vide (même s'il serait préférable d'utiliser \\s+
du point de vue de l'efficacité). Si vous remplaciez par une chaîne non vide, les deux se comporteraient différemment.
Tout d'abord, vous devez comprendre que le résultat final des deux instructions sera le même, à savoir supprimer tous les espaces d'une chaîne donnée.
Cependant x.replaceAll("\\s+", "");
sera un moyen plus efficace de rogner les espaces (si la chaîne de caractères peut avoir plusieurs espaces contigus), car le nombre de remplacements sera potentiellement moins élevé du fait que la regex \\s+
correspond à 1 ou plusieurs espaces à la fois et les remplace par une chaîne vide.
Ainsi, même si vous obtenez le même résultat avec les deux, il est préférable de les utiliser :
x.replaceAll("\\s+", "");
La première regex correspondra à un caractère d'espacement. La deuxième regex correspondra à contrecœur à un ou plusieurs caractères d'espacement. Dans la plupart des cas, ces deux regex sont très similaires, sauf que dans le second cas, la regex peut faire correspondre une plus grande partie de la chaîne, si cela empêche la correspondance de la regex d'échouer. from http://www.coderanch.com/t/570917/java/java/regex-difference
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.