C#正则表达式替换不起作用

C#正则表达式替换不起作用,c#,regex,file,text,C#,Regex,File,Text,我正在尝试从文本文件中删除新行。在记事本中打开文本文件不会显示我试图删除的换行符(它看起来像一堵巨大的文本墙),但是当我在sublime中打开文件时,我可以看到它们 在sublime中,我可以删除模式“\n\n”,然后删除模式“\n(?!AAD)”,这没问题。但是,当我运行以下代码时,生成的文本文件保持不变: public void Format(string fileloc) { string str = File.ReadAllText(filelo

我正在尝试从文本文件中删除新行。在记事本中打开文本文件不会显示我试图删除的换行符(它看起来像一堵巨大的文本墙),但是当我在sublime中打开文件时,我可以看到它们

在sublime中,我可以删除模式“\n\n”,然后删除模式“\n(?!AAD)”,这没问题。但是,当我运行以下代码时,生成的文本文件保持不变:

        public void Format(string fileloc)
    {
        string str = File.ReadAllText(fileloc);
        File.WriteAllText(fileloc + "formatted", Regex.Replace(Regex.Replace(str, "\n\n", ""), "\n(?!AAD)", ""));
    }

我做错了什么?

这可能是windows/linux不匹配吗?请尝试替换“\r\n”。

这可能是windows/linux不匹配吗?请尝试替换“\r\n”。

经验解决方案。在二进制模式下打开示例文件,发现它包含0x0D字符,这些字符是回车符
\r
。所以我想出了这个(多行代码以便于调试):


经验的解决方案。在二进制模式下打开示例文件,发现它包含0x0D字符,这些字符是回车符
\r
。所以我想出了这个(多行代码以便于调试):


如果您不想花费数小时尝试为各种类型的换行符重新调整代码,以下是一个通用解决方案:

string str = File.ReadAllText(fileloc);
File.WriteAllText(fileloc + "formatted", 
    Regex.Replace(Regex.Replace(str, "(?:\r?\n|\r){2}", ""), "(?:\r?\n|\r)(?!AAD)", "")
);
详细信息


换行符可以与
(?:\r?\n |\r)
匹配:可选的CR后跟一个强制的LF。要匹配两个连续的换行符,可以附加限制量词-
(?:\r?\n |\r){2}

如果您不想花费数小时尝试为各种类型的换行符重新调整代码,下面是一个通用解决方案:

string str = File.ReadAllText(fileloc);
File.WriteAllText(fileloc + "formatted", 
    Regex.Replace(Regex.Replace(str, "(?:\r?\n|\r){2}", ""), "(?:\r?\n|\r)(?!AAD)", "")
);
详细信息


换行符可以与
(?:\r?\n |\r)
匹配:可选的CR后跟一个强制的LF。为了匹配两个连续的换行符,可以附加限制量词-
(?:\r?\n |\r){2}

在哪个平台上运行此操作?也许您的换行符实际上是
\r\n
?在正则表达式模式前面放一个
@
。或双反斜杠。将\n替换为\r\n或\\n,以及将@放在模式前面都不会导致任何更改。此外,如果这些模式在sublime中可以工作,为什么它们不能在c#中工作?请与我们共享确切的文件。@WiktorStribiżew我不能。该文件包含客户机密信息。这是一个包含客户姓名、电子邮件和地址的导出。您在哪个平台上运行此功能?也许您的换行符实际上是
\r\n
?在正则表达式模式前面放一个
@
。或双反斜杠。将\n替换为\r\n或\\n,以及将@放在模式前面都不会导致任何更改。此外,如果这些模式在sublime中可以工作,为什么它们不能在c#中工作?请与我们共享确切的文件。@WiktorStribiżew我不能。该文件包含客户机密信息。它是一种包含客户姓名、电子邮件和地址的导出。或
Environment.Newline
以可移植的方式涵盖这两种内容,或
Environment.Newline
以可移植的方式涵盖这两种内容