103

以下两个表达式有什么区别?

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

4 回答 4

96

第一个匹配单个空格,而第二个匹配一个或多个空格。它们是所谓的正则表达式量词,它们执行这样的匹配(取自文档):

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
于 2013-03-25T22:02:05.680 回答
61

这两个replaceAll调用将始终产生相同的结果,无论是什么x。但是,需要注意的是,这两个正则表达式并不相同:

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

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

于 2013-03-25T22:04:22.197 回答
11

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

但是x.replaceAll("\\s+", "");,由于正则表达式\\s+一次匹配 1 个或多个空格并用空字符串替换它们,因此可能会减少替换次数,因此修剪空格的方法会更有效(如果字符串可以有多个连续空格)。

因此,即使您从两者获得相同的输出,最好使用:

x.replaceAll("\\s+", "");
于 2013-03-25T22:04:31.383 回答
2

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

于 2013-03-25T22:02:42.147 回答