代码之家  ›  专栏  ›  技术社区  ›  Teekin

需要regex(使用c)将所有空白压缩为单个空白

  •  2
  • Teekin  · 技术社区  · 15 年前

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

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

    我对regex非常困惑,以至于我最终只问了一个问题。

    注意事项:

    • 我无法控制文档,因为它可能是Internet上的任何文档。

    • 我用的是C,所以如果有人知道如何用C来做这件事,那就更棒了。

    • 我真的不需要使用regex(在有人问之前),但我认为这可能是最佳的方式,因为regex是为这类东西设计的,而且我自己的strpos/str ou replace/substr soup也可能无法发挥作用。性能在这一点上很重要,所以我基本上要寻找的是一种有效的方法来对互联网上的任意文本文件进行此操作(记住,我无法预测大小!).

    事先谢谢! -海尔吉

    5 回复  |  直到 15 年前
        1
  •  4
  •   Community    7 年前

    你会发现这个答案很有用:

    How do I replace multiple spaces with a single space in C#?

    调整答案也替换制表符和换行符是相对直接的:

    RegexOptions options = RegexOptions.None;
    Regex regex = new Regex(@"\s+", options);     
    tempo = regex.Replace(tempo, @" ");
    
        2
  •  11
  •   womp    15 年前
    newString = Regex.Replace(oldString, @"\s+", " ");
    

    “s”是一个 regex character class 对于任何空白字符,+表示“一个或多个”。它用一个简单的空格字符替换每一次出现。

        3
  •  1
  •   to StackOverflow    15 年前

    作为一个同情 Jamie Zawinski 关于雷杰克斯的立场,我将提供一个选择,以换取它的价值。

    我不想对它信奉宗教,但我想说它比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();
        }
    
        4
  •  0
  •   Woot4Moo    15 年前
    I would suggest you replace your chomp with
     $line =~ s/\s+$//;
    

    which will strip off all trailing white spaces - tabs, spaces, new lines and returns as well.

    取自: http://www.wellho.net/forum/Perl-Programming/New-line-characters-beware.html

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

        5
  •  0
  •   tvanfosson    15 年前

    实际上,我认为扩展方法可能更有效,因为您没有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();
    }