我有一个包含以下行的文本文件,例如:
我想仅在前一行包含CR的时候删除CR LF。通过正则表达式我可以删除oall字符,但我无法建立条件来检查上一行。
任何人都可以帮助我吗?
答案 0 :(得分:1)
你可以替换
\r(?= *\r)
什么也没有。
它只匹配CR
后跟CR
&#s;(可选地以空格开头)。实际匹配仅第一个CR
,其余的是通过预测完成的,因此替换只会替换掉CR
的{{1}}' s LF
。
它与您要求的内容略有不同,因为它不会移除CRLF
,而是移除单个CR
,这将使包含所有CRLF
结尾的更统一的文件,而不是单个CR
和CRLF
行尾的混合。
即
Regex re = new Regex("\r(?= *\r)");
string sResult = re.Replace( sInput, "").ToString() );
修改强>
考虑到这一点,我的解决方案将在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