【问题标题】:Removing multiple whitespace, c# [duplicate]删除多个空格,c# [重复]
【发布时间】:2013-07-31 08:44:35
【问题描述】:

我正在尝试将空格大小减少到 1 个字符(删除任何不需要的空格。我应该如何处理任务?

PS.: 没有正则表达式

编辑:谢谢,已经成功,感谢拆分+加入的建议。不幸的是,由于沮丧的青少年已经向我发送垃圾邮件,因为我提出了“一个对网站来说太简单的问题”,因此无法对任何回复进行投票。

EDIT2.:我如何确保它不会删除句子前面的空格,以防万一?

【问题讨论】:

  • 你有没有尝试过,或者只是在这里请求解决方案?用 for 循环来做这件事不是一门火箭科学……
  • 根据文本对文本进行拆分,如果字符串长度大于一则加入所有字符串。
  • 我试过 for sentence = sentence.Replace(" ", " ");但这是个糟糕的主意
  • var res = string.Join(" ", myString.Split(new char []{' '} , StringSplitOptions.RemoveEmptyEntries));怎么样
  • @Damith 会起作用,但我认为创建一个字符串数组然后重新加入它们对性能没有好处(尤其是长文本)

标签: c# whitespace


【解决方案1】:

怎么样

string.Join(" ", 
   myString.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))

编辑

作为扩展

    public static string RemoveWhiteSpaces(this string s)
    {
        return string.Join(" ", s.Split(new char[] { ' ' }, 
               StringSplitOptions.RemoveEmptyEntries));
    }
myString.RemoveWhiteSpaces();

【讨论】:

    【解决方案2】:

    字符串类的扩展

    public static string RemoveExcessSpaces(this string str)
    {
        StringBuilder sb = new StringBuilder(str.Length);
        bool first = true;
        for (int i = 0; i < str.Length; i++)
        {
            char c = str[i];
            switch (c)
            {
                case '\r':
                case '\n':
                case '\t':
                case ' ':
                    if(first)
                    {
                        sb.Append(c);
                        first = false;
                    }
                    else
                        continue;
                    break;
                default:
                    sb.Append(c);
                    first = true;
                    break;
            }
        }
        return sb.ToString();
    }
    

    调用它

    string result = "This is   a   test whit \t\t\r\n    multiple spaces";
    result = result.RemoveExcessSpaces();
    

    Giving credit to the original idea

    当然,应该被视为空白的字符集可以通过一个字符列表来定义,(或使用Char.IsWhiteSpace),但也许这可能对性能更好

    【讨论】:

      【解决方案3】:

      您可以使用此代码:

      public static String WhiteSpaceReducer(String value) {
        if (String.IsNullOrEmpty(value))
          return value;
      
        Boolean wasWhiteSpace = false;
        StringBuilder Sb = new StringBuilder();
      
        foreach (Char Ch in value) 
          if (Char.IsWhiteSpace(Ch)) {
            if (!wasWhiteSpace)
              Sb.Append(Ch);
      
            wasWhiteSpace = true;
          }
          else {
            wasWhiteSpace = false;
            Sb.Append(Ch);
          }
      
        return Sb.ToString();
      }
      
      
      ...
      
      String test = "   test   me  out  ";
      String result = WhiteSpaceReducer(test);
      

      【讨论】:

        【解决方案4】:

        你这样做

        string myString = "I'm too            lazy for research.";
        myString = Regex.Replace(myString, @"\s+", " ");
        

        【讨论】:

        • "I'm_too____lazy_for____research." 这个呢?
        • 但是什么时候在一个地方是三个或更多的空格? ;)
        • 这会删除所有个空格,不是吗?
        • 是的,这会删除每个空格,这不是我想要的
        • @TheProvost 应该可以工作,但请注意问题中的“NO Regex”:)