我试图编写一个正则表达式,用\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来解决这个问题,但我仍然对我的替代方法不起作用的原因感兴趣我期待。
感谢您的回答。
答案 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\n
和Two
之间的Three
之前,它不会匹配。