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


Answers:


88

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

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

20
我一直很喜欢它们如何分别描述每个量词的贪婪,不情愿和所有格形式,然后对这三个量说完全相同。;)
艾伦·摩尔

60

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

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

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


如果x是“立即预订您的域并获取\ n \ n \ n \ n \ n \ n今天在线”,请写第一行。两者都会产生相同的结果吗?
sofs1,2013年

3
@ user3705478两者都会产生相同的结果,即使彼此之间有多个空格也是如此。区别在于处理方式。如果您有一组(例如)3个紧挨着彼此的空格,\\ s +会将该组变成整个“ \”,而\\ s会自行处理每个空格。
丹妮

11

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

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

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

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

2

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


拼写“勉强”一词。这个问题是关于\s+,而不是\s+?其他问题。
艾伦·摩尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.