Рубин или регулярное выражение для удаления лишних разрывов строк - PullRequest
3 голосов
/ 25 сентября 2010

Как бы вы это включили:

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".

Ответы [ 3 ]

2 голосов
/ 26 сентября 2010

Как-то так?

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 голосов
/ 25 сентября 2010

Заменить

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

на

\1

Где \1 относится к обратной ссылке.В рубине они сделаны через $1, я полагаю.

1 голос
/ 25 сентября 2010
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 )}

То же самое.

...