匹配两个以上的空格但不包括换行符的正则表达式

110

我想替换字符串中所有超过2个空格(但不是换行符),我有这个正则表达式:\s{2,},但它也匹配换行符。

如何只匹配2个或更多的空格而不是换行符?

我正在使用c#。


@nihcap - 实际上,C#没有自己的正则表达式风格,它是 .Net 公共库的一部分。在这种情况下,.Net 和 C# 都是有用的标签。 - Kobi
3个回答

187
把你想匹配的空白字符放在字符类里面。例如:
[ \t]{2,}

匹配两个或更多的空格或制表符。

你也可以这样做:

[^\S\r\n]{2,}

此正则表达式匹配任何至少两个空白字符,但不包括\r\n(注意\S中的大写字母S代表[^\s])。


你在最后一句话中所说的“short for”是什么意思?如果没有这个简写,整个正则表达式会是什么样子? - Lonnie Best
7
在正则表达式中,对于转义序列比如\w,通常约定大写的转义序列是小写转义序列的反义字符集。例如,\d是\D的反义字符集,\s是\S的反义字符集,\w是\W的反义字符集等等。同时,在由方括号[ ]分隔的字符类集合中(例如[abc]),可以使用[^abc]来指定反义。因此,\S等同于[^\s],如果允许的话,它也等同于不允许符号 [^^\S]。(^^ 不是表示反义的有效方式。) - Dejay Clayton
@DejayClayton 谢谢,我不知道那个。 - Lonnie Best
这个答案是有效的,但为什么\s{2,}会匹配其后的换行符呢?如果是\n\s{2,},我就能理解了。而且为什么在方括号中输入一个字面空格也能起作用呢? - Modular
这个答案是有效的,但是为什么\s{2,}会捕获在它之后的换行符呢?因为\s匹配空格、制表符和换行符。“而且在方括号中键入一个文字空格为什么能够工作?”嗯,因为它确实可以。对此我也不知道该说些什么 :) - Bart Kiers

3
正则表达式仅匹配两个空格: [ ]{2,} 在正则表达式中,方括号表示字符类,这里只表示空格。花括号后面的数字表示出现的次数,此处表示两次或更多次。

0
你是指严格大于两个还是至少两个?如果是前者,在你的量词中使用三个。否则保持为两个。
一种方法是使用德摩根定律:
[^\S\r\n]

读作“非非空格或非回车或非换行”,或者解开双重否定后,“空格但不是回车或换行”。在\S中的大写字母表示\s的补集。
为了让我们的语法老师开心,请说出你想要的,而不是你不想要的。
[\t\f\cK ]

这个匹配,制表符,换页符,垂直制表符或空格。对于您的输入来说,可能有点过头了,一个简单的空格就足够了。
[\t ]

可能足够。
要了解更多详细信息,请参阅2010年相关答案

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接