2013-03-25 72 views

回答

55

第一个单一的空白匹配之间的差异,而第二个匹配一个或多个空格。他们是所谓的正则表达式量词,和他们进行这样的比赛(从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 
+8

我一直很喜欢他们如何分别描述每个量词的贪婪,不情愿和占有欲,然后对所有三个人说完全一样的话。 ;) – 2013-03-25 22:50:15

2

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

+0

划伤单词“不情愿”。这个问题是关于'\ s +',而不是'\ s +?'就像另一个问题。 – 2013-03-25 23:13:08

30

这两个replaceAll调用总是会产生相同的结果,无论x是什么。然而,值得注意的是,两个正则表达式是不一样重要的是:

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

在这种情况下,它没有区别,因为您用空字符串替换所有内容(尽管从效率的角度来看最好使用\\s+)。如果你用一个非空字符串替换,两者的行为会有所不同。

+0

W.r.t您的第一行,如果x是“预订您的域名并获取\ n \ n \ n \ n \ n \ n在线今日”。两者会产生相同的结果吗? – user3705478 2016-12-15 10:01:26

+2

@ user3705478两者都会产生相同的结果,即使在彼此之后会有多个空格。区别在于它处​​理的方式。如果你有一组(例如)3个空格直接跟随另一个\\ s +接受该组,并将其整体变成一个“”,而\\ s将自己处理每个空间。 – Daemun 2017-01-04 09:29:03

7

首先,您需要了解两个语句的最终输出将是相同的,即从给定字符串中删除所有空格。

然而x.replaceAll("\\s+", "");将修剪的空间(如果串可具有多个连续空格)由于更高效的方式潜在更少不会因更换的事实该正则表达式\\s+比赛1或多个空格一次,并用空字符串替换它们。

所以,即使你得到同样的输出都最好是使用:

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