2008-08-27 96 views
35

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

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

我知道该怎么使用计划String.Replace它,如:

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

然而,这是不雅,而且会摧毁任何“\ r + \ r \ n”已在文本(虽然他们不太可能存在)。

回答

40

这会吗?

[^\r]\n 

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

如果你想让它检测到只是一个单一的“\ n”开头的行为好,然后尝试

([^\r]|$)\n 

它说,它应该匹配“\ n”,但只有那些是第一个字符的行或而不是前面加'\ r'

可能有特殊情况需要检查,因为您弄乱了行本身的定义,'$'可能不太适用。但我认为你应该明白。

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

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

如果字符串以“\ n”开头,这将不起作用。 – 2011-12-28 22:52:04

+0

不适用于\ n \ n – Jerome 2014-05-02 20:45:56

3

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

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

回答chakrit给出也会去,但你需要使用正则表达式,但因为你不说什么“myStr的”是...

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

Edit2:一个工具是非常有价值的时候摆弄正则表达式,xpath,什么都不给你奇怪的结果,我可以指点你:http://www.regexbuddy.com/

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

$可能需要是\

55

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

(?<!\r)\n 

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

12

我正试图将下面的代码转换为字符串,但它不工作。

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

我用Regex.Replace和它的工作

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

试试这个方法:更换(Char.ConvertFromUtf32(13),Char.ConvertFromUtf32(10)+ Char.ConvertFromUtf32(13))

1

如果我知道行尾必须是CRLF或LF之一,这东西对我的作品是

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

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