【问题标题】:Regex (C#): Replace \n with \r\n正则表达式 (C#):将 \n 替换为 \r\n
【发布时间】:2010-09-07 01:26:18
【问题描述】:

如何使用 C# 中的正则表达式将 \n 的单独实例替换为 \r\n(LF 单独与 CRLF)?

对不起,如果这是一个愚蠢的问题,我是 Regex 的新手。

我知道使用计划String.Replace 来做到这一点,例如:

myStr.Replace("\n", "\r\n");
myStr.Replace("\r\r\n", "\r\n");

但是,这很不雅,并且会破坏文本中已经存在的任何“\r+\r\n”(尽管它们不太可能存在)。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    如果你使用它可能会更快。

    (?<!\r)\n
    

    它基本上会查找任何前面没有\r 的\n。这很可能会更快,因为在另一种情况下,几乎每个字母都匹配 [^\r],所以它会捕获它,然后在之后查找 \n。在我给出的示例中,它只会在找到 \n 时停止,然后他们会在此之前查看是否找到 \r

    【讨论】:

      【解决方案2】:

      这样可以吗?

      [^\r]\n
      

      基本上它匹配一个前面有一个不是'\r'的字符的'\n'。

      如果您希望它也检测仅以单个 '\n' 开头的行,请尝试

      ([^\r]|$)\n
      

      这表示它应该匹配一个'\n',但只匹配那些是一行的第一个字符或那些以'\r'开头的字符

      可能有一些特殊情况需要检查,因为你弄乱了行本身的定义,'$' 可能不能很好地工作。但我认为你应该明白这一点。

      编辑: credit @Kibbee 使用前瞻 s 显然更好,因为它不会捕获匹配的前面字符,并且应该有助于处理任何边缘情况。所以这里有一个更好的正则表达式 + 代码变为:

      myStr = Regex.Replace(myStr, "(?<!\r)\n", "\r\n");
      

      【讨论】:

      • 应该是 myStr = Regex.Replace(myStr, "(?
      【解决方案3】:

      我试图对字符串执行下面的代码,但它不起作用。

      myStr.Replace("(?<!\r)\n", "\r\n")
      

      我使用了 Regex.Replace 并且成功了

      Regex.Replace( oldValue, "(?<!\r)\n", "\r\n")
      

      【讨论】:

      • 正如预期的那样; String#Replace 不是正则表达式驱动的。
      【解决方案4】:

      我猜“myStr”是一个字符串类型的对象,在这种情况下,这不是正则表达式。 \r 和 \n 是 CR 和 LF 的等价物。

      我最好的猜测是,如果你知道每行都有一个\n,那么无论如何,你首先应该去掉每个\r。然后将所有\n替换为\r\n。

      chakrit 给出的答案也可以,但是你需要使用正则表达式,但是因为你没有说“myStr”是什么......

      编辑:看其他例子告诉我一件事..为什么做困难的事情,什么时候可以轻松做?,因为有正则表达式,与“必须使用”不一样:D

      Edit2:在摆弄正则表达式、xpath 和诸如此类的东西时非常有价值的工具会给你带来奇怪的结果,我可以指点你:http://www.regexbuddy.com/

      【讨论】:

        【解决方案5】:
        myStr.Replace("([^\r])\n", "$1\r\n");
        

        $ 可能需要是 \

        【讨论】:

          【解决方案6】:

          试试这个:替换(Char.ConvertFromUtf32(13), Char.ConvertFromUtf32(10) + Char.ConvertFromUtf32(13))

          【讨论】:

            【解决方案7】:

            如果我知道行尾必须是 CRLF 或 LF 之一,那么对我有用的是

            myStr.Replace("\r?\n", "\r\n");
            

            这基本上与neslekkiM 的答案相同,只是它只对字符串执行一次替换操作,而不是两次。这也与不支持负后向或反向引用的正则表达式引擎兼容。

            【讨论】:

              猜你喜欢
              • 2020-05-24
              • 1970-01-01
              • 2023-03-21
              • 2017-11-17
              • 2013-05-09
              • 1970-01-01
              • 1970-01-01
              • 2021-06-05
              相关资源
              最近更新 更多