2010-09-25 50 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)} 

是否一樣。