如何用C#中的单个空格replace多个空格?

如何在C#中只用一个空格replacestring中的多个空格?

例:

1 2 3 4 5 

将会:

 1 2 3 4 5 
 RegexOptions options = RegexOptions.None; Regex regex = new Regex("[ ]{2,}", options); tempo = regex.Replace(tempo, " "); 

我喜欢用:

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

由于它会捕获任何types的空白(例如制表符,换行符等)的运行并将其replace为一个空格。

我认为马特的回答是最好的,但我不相信这是对的。 如果你想replace换行符,你必须使用:

 myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline); 
 string xyz = "1 2 3 4 5"; xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries )); 

另一种使用LINQ的方法是:

  var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s)); str = string.Join(" ", list); 

比这一切简单得多:

 while(str.Contains(" ")) str = str.Replace(" ", " "); 
 myString = Regex.Replace(myString, " {2,}", " "); 

即使执行简单的任务,正则expression式也可能非常慢。 这将创build一个扩展方法,可以使用任何string

  public static class StringExtension { public static String ReduceWhitespace(this String value) { var newString = new StringBuilder(); bool previousIsWhitespace = false; for (int i = 0; i < value.Length; i++) { if (Char.IsWhiteSpace(value[i])) { if (previousIsWhitespace) { continue; } previousIsWhitespace = true; } else { previousIsWhitespace = false; } newString.Append(value[i]); } return newString.ToString(); } } 

它会被这样使用:

 string testValue = "This contains too much whitespace." testValue = testValue.ReduceWhitespace(); // testValue = "This contains too much whitespace." 

你可以简单地在一个行解决scheme中做到这一点

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

如果你喜欢,你可以select其他的括号(或者其他字符)。

按照Joel的观点来回答其他的答案,希望稍微改进一点:

你可以用Regex.Replace()来做到这一点:

 string s = Regex.Replace ( " 1 2 4 5", @"[ ]{2,}", " " ); 

或者用String.Split()

 static class StringExtensions { public static string Join(this IList<string> value, string separator) { return string.Join(separator, value.ToArray()); } } //... string s = " 1 2 4 5".Split ( " ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries ).Join (" "); 

对于那些不喜欢正则Regex ,这是一个使用StringBuilder的方法:

  public static string FilterWhiteSpaces(string input) { if (input == null) return string.Empty; StringBuilder stringBuilder = new StringBuilder(input.Length); for (int i = 0; i < input.Length; i++) { char c = input[i]; if (i == 0 || c != ' ' || (c == ' ' && input[i - 1] != ' ')) stringBuilder.Append(c); } return stringBuilder.ToString(); } 

在我的testing中,与静态编译的正则expression式相比,这种方法的平均速度是一个非常大的小到中等大小的string的16倍。 与非编译或非静态正则expression式相比,这应该更快。

请记住,它不会删除前导或尾随空格,只会出现多次。

这是一个较短的版本,只有在你只做一次的情况下才能使用,因为每次调用时都会创build一个Regex类的新实例。

 temp = new Regex(" {2,}").Replace(temp, " "); 

如果你对正则expression式不太了解,下面是一个简单的解释:

{2,}对前面的字符进行正则expression式search,并find2到无限次的子string。
.Replace(temp, " ")用一个空格replacestringtemp中的所有匹配项。

如果你想多次使用,这是一个更好的select,因为它在编译时创build了正则expression式IL:

 Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled); temp = singleSpacify.Replace(temp, " "); 

我刚刚写了一个我喜欢的新Join ,所以我想我会重新回答:

 public static string Join<T>(this IEnumerable<T> source, string separator) { return string.Join(separator, source.Select(e => e.ToString()).ToArray()); } 

关于这个的一个很酷的事情是它通过调用元素的ToString()来处理不是string的集合。 用法仍然是一样的:

 //... string s = " 1 2 4 5".Split ( " ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries ).Join (" "); 

我知道这是相当古老的,但在尝试完成几乎相同的事情时遇到了这个问题。 在RegEx Buddy中find这个解决scheme。 该模式将用单个空格replace所有的双空格,并且还修剪前导空格和尾随空格。

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

由于我们正在处理空白空间,所以它有点难以阅读,所以这里再次用“_”replace“空格”。

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

“(?m:”构造使“多行”选项成为可能。我通常喜欢在模式本身中包含任何选项,使其更加独立。

试试这个方法

  private string removeNestedWhitespaces(char[] st) { StringBuilder sb = new StringBuilder(); int indx = 0, length = st.Length; while (indx < length) { sb.Append(st[indx]); indx++; while (indx < length && st[indx] == ' ') indx++; } return sb.ToString(); } 

像这样使用它:

 string test = removeNestedWhitespaces("1 2 3 4 5".toCharArray()); 

旧的skool:

 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 " ) ); 

我可以用这个删除空格

 while word.contains(" ") //double space word = word.Replace(" "," "); //replace double space by single space. word = word.trim(); //to remove single whitespces from start & end. 

不使用正则expression式:

 while (myString.IndexOf(" ", StringComparison.CurrentCulture) != -1) { myString = myString.Replace(" ", " "); } 

可以在短string上使用,但是对于有很多空格的长string会performance不好。