Expressions regex en Java, \\ s contre \\ s +

96

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

x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
mpluse
la source
3
Quantificateurs, lisez-les.
jn1kk

Réponses:

88

Le premier correspond à un seul espace blanc, tandis que le second correspond à un ou plusieurs espaces. Ce sont les soi-disant quantificateurs d'expressions régulières, et ils effectuent des correspondances comme celle-ci (extraite de la 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
Óscar López
la source
20
J'ai toujours aimé la façon dont ils fournissent des descriptions séparées des versions cupides, réticentes et possessives de chaque quantificateur, puis disent exactement la même chose à propos des trois. ;)
Alan Moore
60

Ces deux replaceAllappels produiront toujours le même résultat, quoi qu'il en xsoit. Cependant, 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 à la séquence d'un ou plusieurs caractères d'espacement.

Dans ce cas, cela ne fait aucune différence, car vous remplacez tout par une chaîne vide (bien qu'il serait préférable d'utiliser \\s+du point de vue de l'efficacité). Si vous remplaçiez par une chaîne non vide, les deux se comporteraient différemment.

arshajii
la source
Écrivez votre première ligne, si x est «Réservez votre domaine et obtenez \ n \ n \ n \ n \ n \ n en ligne aujourd'hui». Les deux produiront-ils les mêmes résultats?
sofs1
3
@ user3705478 Les deux produiront les mêmes résultats, même s'il y aurait plusieurs espaces l'un après l'autre. La différence réside dans la façon dont il est géré. Si vous aviez un groupe de (par exemple) 3 espaces qui se suivent directement, \\ s + prend ce groupe et le transforme en un "", tandis que \\ s traiterait chaque espace seul.
Dennie
11

Tout d'abord, vous devez comprendre que la sortie finale des deux instructions sera la même, c'est-à-dire pour supprimer tous les espaces d'une chaîne donnée.

Cependant, ce x.replaceAll("\\s+", "");sera un moyen plus efficace de rogner les espaces (si la chaîne peut avoir plusieurs espaces contigus) en raison de potentiellement moins de remplacements en raison du fait que regex \\s+correspond à 1 ou plusieurs espaces à la fois et les remplace par une chaîne vide.

Donc, même si vous obtenez le même résultat des deux, il est préférable d'utiliser:

x.replaceAll("\\s+", "");
anubhava
la source
2

Le premier regex correspondra à un caractère d'espacement. La seconde expression régulière correspondra à contrecœur à un ou plusieurs caractères d'espacement. Dans la plupart des cas, ces deux expressions régulières sont très similaires, sauf dans le second cas, l'expression régulière peut correspondre à une plus grande partie de la chaîne, si elle empêche la correspondance d'expression régulière d'échouer. sur http://www.coderanch.com/t/570917/java/java/regex-difference

Evgenyl
la source
Grattez le mot «à contrecœur». Cette question concerne \s+, pas \s+?comme cette autre question.
Alan Moore