105 votes

Expressions Regex en Java, \\s vs. \\s +

Quelle est la différence entre les deux expressions suivantes ?

x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");

97voto

Óscar López Points 97105

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

61voto

arshajii Points 65653

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.

11voto

anubhava Points 172509

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+", "");

2voto

evgenyl Points 2654

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.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