从 C# 中的文本文件中删除 CR LF

Remove CR LF from text file in c#

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

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

谁能帮帮我?

您可以使用

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

并替换为 </code>。</p> <p><strong>详情</strong></p> <ul> <li><code>(\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", "")
            .Replace("\r", "<CR>").Replace("\n", "<LF>"));
    // =>      Line 1<CR>     Line 2<CR><LF>     <CR><LF>     more text
    

    你可以替换

    \r(?= *\r)
    

    一无所有。

    它只匹配 CR 后跟 CR(可选地在前面加上 space)。实际匹配是 只有 第一个 CR 其余的是通过前瞻完成的,所以替换只替换缺少的 CR 它是 LF.

    这与您的要求略有不同,因为它没有删除 CRLF,而是删除了单个 CR,这将使所有 CRLF 结尾,而不是单个 CRCRLF 结尾的混合 .

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

    See it here at ideone.

    编辑

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

    \r *(?=\r)
    

    使其 匹配 space ,使替换删除它们。

    使用以下代码将其归档:

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