43

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

抱歉,如果这是一个愚蠢的问题,我是 Regex 的新手。

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

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

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

4

7 回答 7

67

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

(?<!\r)\n

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

于 2008-08-28T16:16:15.527 回答
45

这会吗?

[^\r]\n

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

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

([^\r]|$)\n

这表示它应该匹配一个 '\n' 但只匹配那些是行的第一个字符或那些前面没有'\r'

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

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

myStr = Regex.Replace(myStr, "(?<!\r)\n", "\r\n");
于 2008-08-27T19:52:19.043 回答
12

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

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

我使用了 Regex.Replace 并且它有效

Regex.Replace( oldValue, "(?<!\r)\n", "\r\n")
于 2011-06-23T04:20:01.083 回答
3

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

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

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

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

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

于 2008-08-27T19:57:01.090 回答
1
myStr.Replace("([^\r])\n", "$1\r\n");

$ 可能需要是 \

于 2008-08-27T19:57:26.143 回答
1

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

于 2011-08-05T04:24:49.343 回答
1

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

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

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

于 2014-07-26T15:47:40.660 回答