为什么这个正则表达式与相邻的换行符不匹配?

时间:2009-11-13 14:14:16

标签: regex replace newline

我试图编写一个正则表达式,用\n替换所有出现的\r\n,除非\n已经紧跟\r。我在Ruby 1.8.6中这样做,它不支持regexp背后的外观,所以我尝试了:

# try to replace \n proceeded by anything other than \r with \r\n
str.gsub(/([^\r])\n/, "\\1\r\n") # \\1 is the captured character to be kept

给定字符串One\n\nTwo\r\nThree的目的是\n\n替换为\r\n\r\n,而 Two 之间的现有\r\n三个保持不变。但是只有两个\n中的第一个匹配。即结果是:

 "One\r\n\nTwo\r\nThree"

我在其他几个regexp引擎中尝试了相同的结果。

最后,我能够通过使用Oniguruma(它确实支持正面和负面的外观)而不是Ruby内置的regexp来解决这个问题,但我仍然对我的替代方法不起作用的原因感兴趣我期待。

感谢您的回答。

2 个答案:

答案 0 :(得分:1)

您只需将\r?\n替换为\r\n

即可
s = s.gsub(/\r?\n/, "\r\n")

这样,所有\r\n\n都被\r\n取代。

答案 1 :(得分:1)

只是写信解释(rsp的评论说同样的事情)为什么你的原始正则表达式不起作用。正则表达式引擎首先匹配([^\r])\n个字符^

One\r\n\nTwo\r\nThree
   ^^^^

第一次更换后,正则表达式引擎位于^

One\r\n\nTwo\r\nThree
       ^

现在正在尝试匹配([^\r])\n,但在插入位置没有\n的字符。因此,在\r\nTwo之间的Three之前,它不会匹配。