正则表达式(C#):将\ n替换为\ r \ n

时间:2020-03-05 18:44:04  来源:igfitidea点击:

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

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

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

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

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

解决方案

回答

这样可以吗

[^\r]\n

基本上,它匹配以'\ n'开头的字符,而不是'\ r'。

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

([^\r]|$)\n

表示应与" \ n"匹配,但仅与行首字符匹配或者与" \ r"不匹配的匹配

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

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

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

回答

我猜想" myStr"是String类型的对象,在这种情况下,这不是正则表达式。
\ r和\ n是CR和LF的等效项。

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

chakrit提供的答案也可以,但是随后我们需要使用正则表达式,但是由于我们没有说" myStr"是什么...

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

Edit2:当使用regex,xpath之类的工具时,它是非常有价值的。

回答

myStr.Replace("([^\r])\n", "\r\n");

$可能需要为\

回答

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

(?<!\r)\n

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