正则expression式(C#):用\ r \ nreplace\ n

如何使用C#中的正则expression式,用\ r \ n(LF单独使用CRLF)replace\ n的单独实例?

对不起,如果这是一个愚蠢的问题,我是新来的正则expression式。

我知道要使用计划String.Replace ,如:

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

然而,这是不雅的,并会破坏文本中的任何“\ r + \ r \ n”(尽pipe它们不可能存在)。

这会做什么?

 [^\r]\n 

基本上它匹配一个“\ n”,前面是一个不是“\ r”的字符。

如果您想要检测以单个“\ n”开头的行,请尝试

 ([^\r]|$)\n 

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

可能有特殊的情况要检查,因为你搞乱线的定义本身的'$'可能不太好。 但我想你应该明白这个主意。

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

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

如果你使用这个可能会更快。

 (?<!\r)\n 

它基本上查找\ n之前没有\ r。 这很可能会更快,因为在另一种情况下,几乎每个字母都匹配[^ \ r],所以它会捕获该字符,然后再查找\ n。 在我给出的例子中,它只会在find\ n之后停下来,并且在它们之前查看它是否find\ r

我正在尝试执行下面的代码到一个string,它不工作。

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

我用Regex.Replace和它的工作

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

我猜“myStr”是Stringtypes的对象,在这种情况下,这不是正则expression式。 \ r和\ n是CR和LF的等价物。

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

chakrit给出的答案也会去,但是你需要使用正则expression式,但是因为你没有说“myStr”是什么…

编辑:看着其他的例子告诉我一件事情。为什么做难的事情,当你可以做到这一点容易?,因为有正则expression式,是不一样的“必须使用”:D

编辑2:一个工具是非常有价值的时候摆弄正则expression式,XPath,而不是给你奇怪的结果,我可以指出: http : //www.regexbuddy.com/

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

$可能需要成为一个\

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

如果我知道行结束必须是CRLF或LF之一,那么适用于我的是

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

这基本上做了相同的neslekkiM的答案,除了它只对string执行一个replace操作而不是两个。 这也与不支持负向反向或反向引用的正则expression式引擎兼容。