正则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式引擎兼容。