Java \\ s中的正则expression式与\\ s +

请问,这些expression式有什么区别?

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

第一个匹配一个空格,而第二个匹配一个或多个空格。 他们是所谓的正则expression式量词,他们执行这样的匹配(从文档中获取 ):

 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 

这两个replaceAll调用总是会产生相同的结果,不pipex是什么。 但是,重要的是要注意两个正则expression式是不一样的:

  • \\s – 匹配单个空格字符
  • \\s+ – 匹配一个或多个空格字符的序列。

在这种情况下,没有什么区别,因为你用一个空stringreplace了所有的东西(尽pipe从效率的angular度来看最好使用\\s+ )。 如果你用一个非空stringreplace,那么这两个字符的行为就会有所不同。

首先,你需要明白,这两个语句的最终输出将是相同的,即删除给定string的所有空格。

但是x.replaceAll("\\s+", ""); 将是更有效的修剪空间的方法(如果string可以有多个连续的空格),因为可能不需要replace,因为正则expression式\\s+匹配一个或多个空格,并用空stringreplace它们。

所以,即使你从两个相同的输出,它是更好的使用:

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

第一个正则expression式将匹配一个空格字符。 第二个正则expression式将不情愿地匹配一个或多个空格字符。 对于大多数用途来说,这两个正则expression式非常相似,除了第二种情况,正则expression式可以匹配更多的string,如果阻止正则expression式匹配失败。 来自http://www.coderanch.com/t/570917/java/java/regex-difference