【问题标题】:Remove CR LF from text file in c#从 C# 中的文本文件中删除 CR LF
【发布时间】:2017-10-05 12:45:06
【问题描述】:

我有一个包含以下行的文本文件,例如:

我只想在前一行末尾包含 CR 时删除 CR LF。通过正则表达式,我可以删除所有字符,但我无法建立条件来检查上一行。

谁能帮帮我?

【问题讨论】:

  • 您的意思是要删除直接跟在以 CR 结尾的行之后的仅空白行吗?尝试(\r)\h*\r\n 并替换为$1
  • 你试过什么?另外,请编辑您的问题,将文本放入问题中,而不是图像。
  • @NightOwl888 我相信图像比文本更好的情况。好吧,至少OP有什么样的输入是清楚的。
  • 这个 "(\r)\h*\r\n" 在 Notepad++ 中有效,但是当我在 VS 中使用它时,代码如下: strFile = Regex.Replace(strFile, @"(\ r)\h*\r\n", "$1");它抛出一个异常:(
  • @PatrickGrebe 在 C# 中,您只需将 \h 替换为 [\p{Zs}\t][\s-[\r\n]],请参阅下面的答案。

标签: c# regex newline str-replace


【解决方案1】:

你可以替换

\r(?= *\r)

一无所有。

它只匹配CR's 后跟CR's(可选地以空格开头)。实际匹配第一个CR,其余的通过前瞻完成,因此替换仅替换缺少它的CR LF

这与您所要求的略有不同,因为它不是删除 CRLF,而是删除单个 CR,这将使文件更加统一,所有 CRLF 结尾,而不是单个CRCRLF 的混合行尾

Regex   re = new Regex("\r(?= *\r)");
string  sResult = re.Replace( sInput, "").ToString() );

See it here at ideone.

编辑

考虑一下,我的解决方案将在行的开头留下空格,然后是 CR-only 行,在它的末尾。您描述的解决方案将在下一个开始时离开。我猜首选是删除它们。为此,将 RE 更改为

\r *(?=\r)

使其也匹配空格,使替换删除它们。

【讨论】:

    【解决方案2】:

    使用以下代码存档:

                String strFile = File.ReadAllText(@file, Encoding.Default);
    
                Regex re = new Regex("\r(?= *\r)");
    
                strFile = re.Replace(strFile, "");
    
                File.WriteAllText(@file + ".tmp", strFile);
    

    【讨论】:

      【解决方案3】:

      你可以使用

      (\r)[\p{Zs}\t]*\r\n
      

      并替换为$1

      详情

      • (\r) - 第 1 组:CR
      • [\p{Zs}\t]* - 后跟 0+ 个水平空格
      • \r\n - 和一个 CRLF。

      替换是捕获到第 1 组的 CR。请参阅 C# demo

      var s = "     Line 1\r     \r\n     Line 2\r\n     \r\n     more text";
      Console.WriteLine(Regex.Replace(s, @"(\r)[\p{Zs}\t]*\r\n", "$1")
              .Replace("\r", "<CR>").Replace("\n", "<LF>"));
      // =>      Line 1<CR>     Line 2<CR><LF>     <CR><LF>     more text
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-10
        • 1970-01-01
        • 2018-10-01
        • 2019-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多