如何在C#中删除字符串中的所有空格字符?

10
亲爱的程序员们,
我正在使用C# Visual Studio 2013编写代码,我刚刚意识到在执行Replace(" ", string.Empty)时可能不需要使用Trim()
以下是一个示例:
SanitizedString = RawString
    .Replace("/", string.Empty)
    .Replace("\\", string.Empty)
    .Replace(" ", string.Empty)
    .Trim();

由于我之前以不同的方式组织了这段代码,所以我没有注意到它:

SanitizedString = RawString.Trim()
    .Replace("/", string.Empty)
    .Replace("\\", string.Empty)
    .Replace(" ", string.Empty);

我知道这些方法的工作方式不同,Trim()会删除所有空格字符,而Replace(" ", string.Empty)仅删除空格字符。

这就是为什么我有一个不同的问题。

我没有看到任何明显的方法可以使用Replace实现。我的问题是,当我希望从字符串中删除所有空格字符时,我该怎么做?

我找到了以下内容:

Efficient way to remove ALL whitespace from String?

但由于我从未使用过正则表达式,我不确定如何将其应用于字符串?


2
SanitizedString = Regex.Replace(Raw...., @"\s+", string.Empty); - Wiktor Stribiżew
所有的空格 - 即使在中间也是吗? - doctorlove
7个回答

25

尝试使用Linq来过滤空格:

  using System.Linq;

  ... 

  string source = "abc    \t def\r\n789";
  string result = string.Concat(source.Where(c => !char.IsWhiteSpace(c)));

  Console.WriteLine(result);

结果:

abcdef789

10

3
这个问题的答案并不像看起来那么简单。问题不在于实际编写替换代码,而在于定义什么是空格。
例如,这篇维基百科文章 列出了许多具有 Unicode 属性 WSpace 的字符(Unicode 代码点),以及许多相关的字符,大多数人会认为它们是空格,但它们没有 WSpace 属性。
鉴于此,我永远不会依赖于某些正则表达式解析器认为的 \s,因为这实际上没有标准化。我非常确定 C# 的正则表达式解析器不会将类似 U+2001 的代码点视为空格,因此它们不会从您的字符串中删除。
这可能对您的应用程序有或没有问题;这取决于首先如何过滤要处理的字符串。但是,如果您要处理外语(换句话说:包含 ASCII 范围之外字符的)字符串,您必须考虑这个问题。

在这样做时,请记住正则表达式的速度较慢。如果您必须自己定义替换(出于上述原因),则应使用更轻量级的替换函数(如果C#或其程序集提供,则我不使用C#,因此不知道)。


2

对于任何来到这个页面的人,有一篇优秀的CodeProject文章,作者在其中对这个问题进行了多种不同解决方案的基准测试。他得出的最快完全托管的解决方案(实质上)如下:

public static string RemoveAllWhitespace(string str) {
    var len = str.Length;
    var src = str.ToCharArray();
    var dstIdx = 0;
    for (var i = 0; i < len; i++) {
        var ch = src[i];
        switch (ch) {
            case '\u0020': case '\u00A0': case '\u1680': case '\u2000': case '\u2001':
            case '\u2002': case '\u2003': case '\u2004': case '\u2005': case '\u2006':
            case '\u2007': case '\u2008': case '\u2009': case '\u200A': case '\u202F':
            case '\u205F': case '\u3000': case '\u2028': case '\u2029': case '\u0009':
            case '\u000A': case '\u000B': case '\u000C': case '\u000D': case '\u0085':
                break;
            default:
                src[dstIdx++] = ch;
                break;
        }
    }
    return new string(src, 0, dstIdx);
}

当然,关于哪些是正确的空白字符集合可能存在许多警告和不同意见,但基本信息非常有用(例如,通过正则表达式远远是最慢的)。完整文章点击这里:https://www.codeproject.com/Articles/1014073/Fastest-method-to-remove-all-whitespace-from-Strin。请注意:我与作者或CodeProject没有任何关联,我只是通过普通网页搜索找到了这篇文章。

1
只需在方法调用时传递字符串,它会返回不带空格的字符串。
 public static string RemoveSpaces(this String Value)
    {
        RegexOptions options = RegexOptions.None;
        Regex regex = new Regex(@"[ ]{2,}", options);
        return regex.Replace(Value.Trim(), @" ");
    }

0
   string Abcd = Console.ReadLine();
        string wspace = "";
                    int len = Abcd.Length;
        for (int i = 0; i <= len-1; i++)
        {
            if (Abcd[i] != ' ')
            {
                wspace = wspace + Abcd[i];
            }

        }
        Console.WriteLine("The Sring Without Space Is= '"+wspace+"'");
        Console.ReadLine();

0

这可能会很方便:

string message = Console.ReadLine().Trim().ToLower();

string message_without_space = message.Split(' ').Aggregate((a, b) => a + b).ToString();

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