如何使用 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”(尽管它们不太可能存在)。
如果你使用它可能会更快。
(?<!\r)\n
它基本上会查找前面没有 \r 的任何 \n。这很可能会更快,因为在另一种情况下,几乎每个字母都匹配 [^\r],所以它会捕获它,然后在之后查找 \n。在我给出的示例中,它只会在找到 \n 时停止,然后他们会在此之前查看是否找到 \r
这会吗?
[^\r]\n
基本上它匹配一个前面有一个不是'\r'的字符的'\n'。
如果您希望它也检测仅以单个 '\n' 开头的行,请尝试
([^\r]|$)\n
这表示它应该匹配一个 '\n' 但只匹配那些是行的第一个字符或那些前面没有'\r'
可能有一些特殊情况需要检查,因为你弄乱了行本身的定义,'$' 可能不能很好地工作。但我认为你应该明白这一点。
编辑:信用@Kibbee 使用look-ahead s 显然更好,因为它不会捕获匹配的前面字符并且应该有助于任何边缘情况。所以这里有一个更好的正则表达式 + 代码变成:
myStr = Regex.Replace(myStr, "(?<!\r)\n", "\r\n");
我试图对字符串执行下面的代码,但它不起作用。
myStr.Replace("(?<!\r)\n", "\r\n")
我使用了 Regex.Replace 并且它有效
Regex.Replace( oldValue, "(?<!\r)\n", "\r\n")
我猜“myStr”是一个字符串类型的对象,在这种情况下,这不是正则表达式。\r 和 \n 是 CR 和 LF 的等价物。
我最好的猜测是,如果您知道每行都有一个 \n,那么无论如何,您首先应该去掉每个 \r。然后将所有\n 替换为\r\n。
chakrit 给出的答案也会消失,但是你需要使用正则表达式,但是因为你没有说什么是“myStr”......
编辑:看其他例子告诉我一件事..为什么做困难的事情,什么时候可以轻松做?,因为有正则表达式,与“必须使用”不同:D
Edit2:在摆弄正则表达式、xpath 之类的东西时,一个工具非常有价值,它会给你带来奇怪的结果,我可以指点你:http ://www.regexbuddy.com/
myStr.Replace("([^\r])\n", "$1\r\n");
$ 可能需要是 \
试试这个:替换(Char.ConvertFromUtf32(13), Char.ConvertFromUtf32(10) + Char.ConvertFromUtf32(13))
如果我知道行尾必须是 CRLF 或 LF 之一,那么对我有用的是
myStr.Replace("\r?\n", "\r\n");
这基本上与neslekkiM的答案相同,只是它只对字符串执行一个替换操作而不是两个。这也与不支持负后向或反向引用的正则表达式引擎兼容。