Как заменить несколько новых строк подряд одной новой строкой, используя Ruby - PullRequest
23 голосов
/ 31 марта 2009

У меня есть скрипт, написанный на ruby. Мне нужно удалить дубликаты новой строки (например,)

\n
\n
\n

до

\n

Моя текущая попытка сработала (или, скорее, нет) с использованием

str.gsub!(/\n\n/, "\n")

Что не дало мне никаких изменений в выводе. Что я делаю не так?

Ответы [ 9 ]

32 голосов
/ 31 марта 2009

Это работает для меня:

#!/usr/bin/ruby

$s = "foo\n\n\nbar\nbaz\n\n\nquux";

puts $s

$s.gsub!(/[\n]+/, "\n");

puts $s
10 голосов
/ 29 сентября 2013

Используйте более идиоматический String#squeeze вместо gsub.

str = "a\n\n\nb\n\n\n\n\n\nc"
str.squeeze("\n") # => "a\nb\nc"
6 голосов
/ 31 марта 2009

Простое разбиение и рекомбинация линий даст желаемый результат

>> "one\ntwo\n\nthree\n".split.join("\n")
=> "one\ntwo\nthree"

Редактировать: я только что заметил, что это заменит ВСЕ подстроки пробелами с новыми строками, например

>> "one    two three\n".split.join("\n")
=> "one\ntwo\nthree"

Сначала убедитесь, что это то, что вы хотите!

5 голосов
/ 31 марта 2009

Вам нужно сопоставить более одной новой строки до бесконечного количества. Ваш пример кода будет работать с небольшим изменением:

str.gsub!(/\n+/, "\n")

Например:

str = "this\n\n\nis\n\n\n\n\na\ntest"
str.gsub!(/\n+/, "\n")  # => "this\nis\na\ntest"
4 голосов
/ 31 марта 2009

Вы уверены, что это не должно быть / \ n \ n \ n /, "\ n" то, что вы, кажется, хотите в вашем вопросе выше.

также, вы уверены, что он не запускает новую строку Windows "\ r \ n"?

РЕДАКТИРОВАТЬ: Дополнительная информация

За комментарий

«Количество новых строк может меняться. В разных строках может быть от 2 до 5 новых строк.»

если вы хотите попасть только на 2-5 строчек, попробуйте это

/\n{2,5}/, "\n"
1 голос
/ 26 августа 2011

Дополнительно, также работает с

  • пробелы в пустых строках
  • n число спина к спине пустых строк

str.gsub! / \ n ^ \ s * \ n /, "\ n \ n"

, где

  • \ n, конечно, перевод строки
  • \ s - это пробел
  • обозначает 1 или более пробелов при использовании после \ s
1 голос
/ 31 марта 2009

Простой вызов split также удалит все ваши пробелы.

Вам нужно передать \n для разделения

>> "one   ok \ntwo\n\nthree\n".split(/\n+/).join("\n")
=> "one  ok \ntwo\nthree"
0 голосов
/ 30 апреля 2014

Попробуйте это у меня сработало:

s = test\n\n\nbar\n\n\nfooo 

s.gsub("\n\n", '')
0 голосов
/ 31 марта 2009

Руби нужно, чтобы обратная косая черта экранировалась не так, как вы указали.

str.sub!("\\\\n+\\\\n","\\\\n")

http://www.ruby -forum.com / тема / 176239

...