Java \\ s与\\ s +中的正则表达式

时间:2013-03-25 21:59:34

标签: java regex string quantifiers

请问,这些表达方式之间有什么区别

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

4 个答案:

答案 0 :(得分:72)

第一个匹配单个空格,而第二个匹配一个或多个空格。它们是所谓的正则表达式量词,它们执行这样的匹配(取自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

答案 1 :(得分:44)

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

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

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

答案 2 :(得分:9)

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

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

所以即使你从两者得到相同的输出,最好使用:

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

答案 3 :(得分:2)

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