需要正则表达式(使用C#)将所有空白压缩为单个空白

需要正则表达式(使用C#)将所有空白压缩为单个空白,c#,html,regex,C#,Html,Regex,我需要将文档中的多个空格替换为单个空格(每次迭代)。不管它们是空格、制表符还是换行符,任何类型的空格组合都需要被截断为单个空格 假设我们有字符串:“Hello,\t\t\n\t\n world”(其中\t和\n分别表示制表符和换行符),那么我需要它变成“Hello,world” 一般来说,我完全被正则表达式搞糊涂了,最后我只是问了一下 考虑事项: 我无法控制文件,因为它可能是互联网上的任何文件 我使用的是C#,所以如果有人知道如何使用C#来实现这一点,那就更棒了 我真的不需要使用regex(在

我需要将文档中的多个空格替换为单个空格(每次迭代)。不管它们是空格、制表符还是换行符,任何类型的空格组合都需要被截断为单个空格

假设我们有字符串:“Hello,\t\t\n\t\n world”(其中\t和\n分别表示制表符和换行符),那么我需要它变成“Hello,world”

一般来说,我完全被正则表达式搞糊涂了,最后我只是问了一下

考虑事项:

  • 我无法控制文件,因为它可能是互联网上的任何文件

  • 我使用的是C#,所以如果有人知道如何使用C#来实现这一点,那就更棒了

  • 我真的不需要使用regex(在有人问之前),但我认为这可能是最好的方法,因为regex是为这类东西设计的,而我自己的strpos/stru_replace/substr soup可能不会执行得那么好。性能对这一点很重要,所以我本质上是在寻找一种有效的方法来处理互联网上的任意文本文件(记住,我无法预测大小!)

提前谢谢!
-Helgi

您可能会发现这个答案很有用:

调整答案以同时替换制表符和换行符相对简单:

RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"\s+", options);     
tempo = regex.Replace(tempo, @" ");
“\s”表示任何空白字符,而+表示“一个或多个”。它用一个简单的空格字符替换每一次出现

I would suggest you replace your chomp with
 $line =~ s/\s+$//;
它将去掉所有尾随的空格-制表符、空格、新行和返回。

摘自:


我知道它是Perl,但它应该对您有足够的帮助。

作为一个同情Regex的人,我将提供一个替代方案

我不想对它信以为真,但我想说它比正则表达式快,不过你是否会处理字符串足够长的时间来观察差异是另一回事

    public static string CompressWhiteSpace(string value)
    {
        if (value == null) return null;

        bool inWhiteSpace = false;
        StringBuilder builder = new StringBuilder(value.Length);

        foreach (char c in value)
        {
            if (Char.IsWhiteSpace(c))
            {
                inWhiteSpace = true;
            }
            else
            {
                if (inWhiteSpace) builder.Append(' ');
                inWhiteSpace = false;
                builder.Append(c);
            }
        }
        return builder.ToString();
    }

实际上,我认为扩展方法可能更有效,因为您没有regex的状态机开销。本质上,它变成了一个非常专业的模式匹配器

public static string Collapse( this string source )
{
    if (string.IsNullOrEmpty( source ))
    {
        return source;
    }

    StringBuilder builder = new StringBuilder();
    bool inWhiteSpace = false;
    bool sawFirst = false;
    foreach (var c in source)
    {
        if (char.IsWhiteSpace(c))
        {
            inWhiteSpace = true;
        }
        else
        {
            // only output a whitespace if followed by non-whitespace
            // except at the beginning of the string
            if (inWhiteSpace && sawFirst)
            {
                builder.Append(" ");
            }
            inWhiteSpace = false;
            sawFirst = true;
            builder.Append(c);
        }
    }
    return builder.ToString();
}

在上面的链接中查看Matt的答案,因为接受的解决方案看起来只是替换空格字符,而不是换行符和制表符。模式中的'\s'告诉它匹配任何空白字符。我在问之前看了,我发誓,我看了!非常感谢,这帮了我的忙。:)
public static string Collapse( this string source )
{
    if (string.IsNullOrEmpty( source ))
    {
        return source;
    }

    StringBuilder builder = new StringBuilder();
    bool inWhiteSpace = false;
    bool sawFirst = false;
    foreach (var c in source)
    {
        if (char.IsWhiteSpace(c))
        {
            inWhiteSpace = true;
        }
        else
        {
            // only output a whitespace if followed by non-whitespace
            // except at the beginning of the string
            if (inWhiteSpace && sawFirst)
            {
                builder.Append(" ");
            }
            inWhiteSpace = false;
            sawFirst = true;
            builder.Append(c);
        }
    }
    return builder.ToString();
}