S'il vous plaît, quelle est la différence entre ces expressions
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
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
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.
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+", "");
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