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

时间:2017-10-05 12:45:06

标签: c# regex newline str-replace

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

example text file

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

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

你可以替换

\r(?= *\r)
什么也没有。

它只匹配CR后跟CR&#s;(可选地以空格开头)。实际匹配第一个CR,其余的是通过预测完成的,因此替换只会替换掉CR的{​​{1}}' s LF

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

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

See it here at ideone

修改

考虑到这一点,我的解决方案将在CR - 仅限行之后的行的开头留下空格。您描述的解决方案将在下一个开始时离开。我猜测首选是删除它们。为此,请将RE更改为

\r *(?=\r)

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

答案 1 :(得分:1)

使用以下代码存档:

            String strFile = File.ReadAllText(@file, Encoding.Default);

            Regex re = new Regex("\r(?= *\r)");

            strFile = re.Replace(strFile, "");

            File.WriteAllText(@file + ".tmp", strFile);

答案 2 :(得分:0)

您可以使用

(\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