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

Posted

技术标签:

【中文标题】Java 中的正则表达式,\\\\s 与 \\\\s+【英文标题】:Regex expressions in Java, \\s vs. \\s+Java 中的正则表达式,\\s 与 \\s+ 【发布时间】:2013-03-15 13:45:16 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

W.r.t 您的第一行,如果 x 是“预订您的域并获取\n \n\n \n \n \n 今天在线。”两者会产生相同的结果吗? @user3705478 两者都会产生相同的结果,即使彼此之后会有多个空格。不同之处在于它的处理方式。如果您有一组(例如)3 个空格,则 \\s+ 将获取该组并将整个组变成一个“”,而 \\s 将自行处理每个空格。【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

刮掉“不情愿”这个词。这个问题是关于\s+,而不是像其他问题那样\s+?【参考方案4】:

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

Greedy quantifiers
X?  X, once or not at all
X*  X, zero or more times
X+  X, one or more times
Xn    X, exactly n times
Xn,   X, at least n times
Xn,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
Xn?   X, exactly n times
Xn,?  X, at least n times
Xn,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
Xn+   X, exactly n times
Xn,+  X, at least n times
Xn,m+ X, at least n but not more than m times

【讨论】:

我一直很喜欢他们如何分别描述每个量词的贪婪、不情愿和所有格版本,然后对这三个量词说完全相同的话。 ;)

以上是关于Java 中的正则表达式,\\s 与 \\s+的主要内容,如果未能解决你的问题,请参考以下文章

[\s\S]* 有啥区别?和 。*?在 Java 正则表达式中?

C# 等效于 Java 标点正则表达式

java的一个匹配多个邮箱的地址的正则表达式问题。

正则表达式 (\S+?) 与 (\S+)) [重复]

java 正则获取 第一个匹配

java 正则获取 第一个匹配