如何用c#中的一个空格替换字符串中的多个空格?

例子:

1 2 3  4    5

是:

1 2 3 4 5

当前回答

老派:

string oldText = "   1 2  3   4    5     ";
string newText = oldText
                    .Replace("  ", " " + (char)22 )
                    .Replace( (char)22 + " ", "" )
                    .Replace( (char)22 + "", "" );

Assert.That( newText, Is.EqualTo( " 1 2 3 4 5 " ) );

其他回答

您可以简单地在一行解决方案中做到这一点!

string s = "welcome to  london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");

如果喜欢,可以选择其他括号(甚至其他字符)。

我仔细查看了建议的解决方案,但没有找到一个可以处理我的情况下可接受的空白字符的混合,例如:

正则表达式。Replace(input, @"\s+", " " ") -它将吃掉你的换行符,如果它们与空格混合,例如\n \n序列将被替换为 正则表达式。Replace(source, @"(\s)\s+", "$1") -它将依赖于空格的第一个字符,这意味着它可能再次吃掉你的换行符 正则表达式。Replace(source, @"[]{2,}", " ") -当有混合空白字符时,它将无法正常工作-例如"\t \t "

可能并不完美,但对我来说快速的解决方法是:

Regex.Replace(input, @"\s+", 
(match) => match.Value.IndexOf('\n') > -1 ? "\n" : " ", RegexOptions.Multiline)

思想是换行胜过空格和制表符。

这不会正确地处理窗口换行,但它也很容易调整工作,不知道正则表达式那么好-可能是有可能适合单一模式。

我知道这很老了,但在尝试完成几乎相同的事情时偶然发现了它。在RegEx Buddy中找到了这个解决方案。该模式将用单个空格替换所有的双空格,并修剪开头和结尾空格。

pattern: (?m:^ +| +$|( ){2,})
replacement: $1

因为我们处理的是空格,所以读起来有点困难,所以这里还是用“_”代替了“空格”。

pattern: (?m:^_+|_+$|(_){2,})  <-- don't use this, just for illustration.

“(?M:" construct启用“多行”选项。我通常喜欢在模式本身中包含任何我可以包含的选项,这样它就更独立了。

我认为Matt的答案是最好的,但我不认为它是完全正确的。如果你想替换换行符,你必须使用:

myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);

其实比这简单得多:

while(str.Contains("  ")) str = str.Replace("  ", " ");