2010-09-25 46 views
3

你将如何把这个:Ruby或正则表达式来剥离多余的换行符

 
Dear Fred 



How are you? 






Regards 
John 

进入这个:

 
Dear Fred 

How are you? 

Regards 
John 

注:单,双中断是允许的,但仅此而已。例如,我们想要去的:

"Dear Fred\n\n\n\nHow are you?\n\n\n\n\n\n\nRegards\nJohn"

"Dear Fred\n\nHow are you?\n\nRegards\nJohn"

但也应该适用于 “\ r \ n”。

+0

对我来说,并发症设法应付各类新行的时候来了。 – 2010-09-25 18:00:29

回答

2

这样的事情?

s.gsub /(\r?\n){3,}/, '\1\1' 

似乎至少你的榜样工作:

irb(main):060:0> s 
=> "Dear Fred\n\n\n\nHow are you?\n\n\n\n\n\n\nRegards\nJohn" 
irb(main):061:0> s.gsub /(\r?\n){3,}/, '\1\1' 
=> "Dear Fred\n\nHow are you?\n\nRegards\nJohn" 
2

更换

(\r\n|\n|\r)\1+ 

\1 

\1指反向引用。在红宝石,他们通过$1完成,我相信。

+1

这不仅导致只有单个休息吗? – 2010-09-25 18:17:54

+0

@Franky:不是当我测试它。是否适合你? – Tomalak 2010-09-25 18:55:06

1
str.gsub!(/\n{3,}/, "\n\n") 
str.gsub!(/(\r\n){3,}/, "\r\n\r\n") 

正则表达式\ \ n {3,} /搜索连续3个或更多的换行符(\ n)。这些被2个换行符取代。 重复\ r \ n。

["\n", "\r\n"].each{|lb| str.gsub!(/(#{lb}){3,}/, lb*2)} 

是否一样。