【问题标题】:C# Regex Replacement Not WorkingC# 正则表达式替换不起作用
【发布时间】:2016-09-29 19:09:45
【问题描述】:

我正在尝试从文本文件中删除新行。在记事本中打开文本文件并没有显示我要删除的换行符(它看起来像一大堵文本墙),但是当我在 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)", ""));
    }

我做错了什么?

【问题讨论】:

  • 你在哪个平台上运行这个?也许你的换行符实际上是\r\n
  • 在正则表达式模式前放置一个@。或者双反斜杠。
  • 用 \r\n 或 \\n 替换 \n,以及将 @ 放在模式的前面都不会导致任何变化。另外,如果这些模式可以在 sublime 中工作,为什么它们不能在 c# 中工作?
  • 与我们分享确切的文件。
  • @WiktorStribiżew 我不能。该文件包含机密的客户信息。这是一个包含客户姓名、电子邮件和地址的导出文件。

标签: c# regex file text


【解决方案1】:

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

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。要匹配 2 个连续的换行符,可以附加一个限制量词 - (?:\r?\n|\r){2}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • Environment.Newline 以便携的方式覆盖两者
      猜你喜欢
      • 1970-01-01
      • 2017-05-13
      • 2023-03-23
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多