【问题标题】:C# Best way to replace x repeated tokens by one tokenC#用一个标记替换x个重复标记的最佳方法
【发布时间】:2009-08-27 12:53:33
【问题描述】:

如果我有:

Some text



More text






Even more text

有什么更优雅的获取方式:

Some text

More text

Even more text

所有都知道重复标记的数量

【问题讨论】:

  • 如果您正在寻找 \r\n,请不要使用正则表达式,因为新行实际上是经过特殊处理的。
  • 你的字符串中真的有“\r\n”字面量还是有换行符?
  • 从接受的答案来看,您的输入中似乎有换行符而不是文字 "\r\n" 字符串。

标签: c# regex token


【解决方案1】:

使用正则表达式的方法是

string replaced = System.Text.RegularExpressions.Regex
    .Replace(input, @"(?:\r\n)+", "\r\n");

(?:...) 语法是非捕获组,可以用捕获组替换(只是 (...)),但效率稍低且可读性较差,IMO。)

【讨论】:

    【解决方案2】:

    也许是这样的:

    var result = string.Join("\r\n", s.Split(new[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries))
    

    【讨论】:

    • 我比正则表达式更喜欢这个,它聪明且具有声明性。
    • 这个比较罗嗦,这么简单的正则表达式,如何更具有声明性?正则表达式版本几乎字面意思是“将每个重复的 \r\n 实例替换为单个 \r\n 实例”。
    【解决方案3】:

    使用正则表达式。匹配整个字符串 '\r\n' 并替换为单个 '\r\n'

    你需要的功能:

    pattern = "(\\r\\n)+";
    Regex rgx = new Regex(pattern);
    
    newString = rgx.Replace(oldString, "\r\n");
    

    编辑:对于之前错过 + 表示歉意

    【讨论】:

    • 不确定这是否有效,因为它会用新行替换每个新行,而不是压缩它们。你的模式需要加分
    【解决方案4】:

    我不知道 C# 语法,但只是使用一个简单的正则表达式将 (\r\n)+ 替换为 (\r\n)

    【讨论】:

      【解决方案5】:

      你可以使用正则表达式:

      str = Regex.Replace(str, "(\r\n)+", "\r\n")
      

      另一种方法是在换行符处拆分删除空条目,然后再次加入:

      str = String.Join("\r\n", str.Split(new string[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries);
      

      考虑是否应该使用字符串文字 "\r\n"Environment.NewLine 常量。这取决于数据的来源。

      【讨论】:

        【解决方案6】:

        如果 \r\n 表示它通常的含义,则您将连续的空行替换为单个空行。

        我确信有用于此目的的工具。不过,我不知道 C#。

        【讨论】:

          【解决方案7】:

          最快的方法:

          Regex reg = new Regex(@"(\r\n)+");
          
          string replacedString = reg.Replace("YOUR STRING TO BE REPLACED", Environment.NewLine);
          

          【讨论】:

            【解决方案8】:

            就在几天前,SO 中也有几乎相同的问题。问题不是 NewLine,而是空格。

            还有一个人更喜欢 Split、Join 方法和另一个使用正则表达式的网站。所以 Jon 对两者进行了比较,结果发现编译正则表达式要快得多。

            但是我再也找不到这个问题了......

            【讨论】:

              【解决方案9】:

              没有正则表达式(这让我很头疼)

              string RemoveRepeated(string needle, string haystack)
              {
                  string doubleNeedle = needle + needle;
              
                  while (haystack.IndexOf(doubleNeedle) >= 0)
                      haystack = haystack.Replace(doubleNeedle, needle);
                  return haystack;
              }
              

              内存分配更少

              string RemoveRepeated(string needle, string haystack)
              {
                  if (needle == null)
                      throw new ArgumentNullException("needle");
              
                  if (haystack == null)
                      throw new ArgumentNullException("haystack");
              
                  if (needle == string.Empty || haystack == string.Empty)
                      return haystack;
              
                  string doubleNeedle = needle + needle;
                  var buffer = new StringBuilder(haystack);
                  int originalLength;
                  do
                  {
                      originalLength = buffer.Length;
                      buffer.Replace(doubleNeedle, needle);
                  } while (originalLength != buffer.Length);
              
                  return buffer.ToString();
              }
              

              初始检查在第一个版本中也同样有效

              【讨论】:

              • 由于字符串在C#中是不可变的,如果字符串中包含doubleNeedle,上述实际上是一个无限循环。
              • @Bojan:是的,我在测试之前发布了它,现在更正了:)
              • 这会很慢,因为它会对字符串进行多次迭代。查看其他答案。
              • @martin:真的吗?你量过吗?如果是这样,要慢多少?最重要的问题,重要吗?有更快的实现,但是如果这是在网页的帖子上并且您正在清理使用输入,这真的重要吗?可能不是。如果您有一根 32k 的琴弦,需要敲击和更换数千根针,那么是的,那可能很重要。
              猜你喜欢
              • 1970-01-01
              • 2020-10-07
              • 2013-12-28
              • 2010-09-06
              • 2021-12-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-07-03
              相关资源
              最近更新 更多