web-dev-qa-db-fra.com

Expressions de regex dans Java \\ s vs. \\ s +

S'il vous plaît, quelle est la différence entre ces expressions

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

Le premier correspond à un seul espace blanc, tandis que le second correspond à un ou plusieurs espaces blancs. Ce sont les soi-disant quantificateurs d'expression régulière, et ils effectuent des correspondances comme ceci (tiré 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
75
Óscar López

Ces deux appels replaceAll produiront toujours le même résultat, quel que soit ce que x est. Cependant, il est important de noter que les deux expressions régulières ne sont pas identiques:

  • \\s - correspond au caractère d'espacement simple
  • \\s+ - correspond à la séquence d'un ou de plusieurs caractères d'espacement.

Dans ce cas, cela ne fait aucune différence, puisque vous remplacez le 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 remplaciez par une chaîne non vide, les deux se comporteraient différemment.

46
arshajii

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 de la chaîne donnée.

Cependant, x.replaceAll("\\s+", ""); sera un moyen plus efficace de supprimer des espaces (si string peut avoir plusieurs espaces contigus) en raison du moins potentiellement de nombre de remplacements dû au fait que regex \\s+ correspond à un ou plusieurs espaces à la fois et remplace eux avec une chaîne vide.

Donc, même si vous obtenez le même résultat des deux côtés, il est préférable d’utiliser:

x.replaceAll("\\s+", "");
9
anubhava

La première expression régulière correspondra à un caractère d'espacement. La deuxième expression rationnelle correspond à contrecœur à un ou plusieurs caractères d'espacement. Dans la plupart des cas, ces deux expressions rationnelles sont très similaires, sauf que dans le second cas, l'expression rationnelle peut correspondre à davantage de chaînes si elle empêche la correspondance de l'expression rationnelle d'échouer. de http://www.coderanch.com/t/570917/Java/java/regex-difference

2
evgenyl