2012-07-02 8 views
3

Я прошел через другие подобные вопросы, и они, похоже, не объясняют мою проблему.Удалить пустые строки из строки в рубине

Мой выход, прямо сейчас, как это, я хотел бы, чтобы удалить пустые строки из строки в рубин,

#  

CIRRUS LADIES NIGHT with DJ ROHIT 

4th of JULY Party ft. DJ JASMEET @ I-Bar 

Submerge Deep @ Pebble | Brute Force (Tuhin Mehta) | DJ Arpan (Opening) 

Champagne Showers - DJs Panic & Nyth @ Blue Waves 

THURSDAY PAST AND PRESENT @ Hint 

, и я хочу, чтобы мой выход, чтобы быть, как это,

CIRRUS LADIES NIGHT with DJ ROHIT 
4th of JULY Party ft. DJ JASMEET @ I-Bar 
Submerge Deep @ Pebble | Brute Force (Tuhin Mehta) | DJ Arpan (Opening) 
Champagne Showers - DJs Panic & Nyth @ Blue Waves 
THURSDAY PAST AND PRESENT @ Hint 

Я пробовал gsub /^$\n/,'', gsub(/\n/,''), squeeze("\n") и delete! "\n" безрезультатно.

Кроме того, я забыл упомянуть, что моя строка начинается с пустой строки, # обозначает пустую строку перед первой строкой, если это что-то изменит.

My String.inspect в соответствии с запросом, содержимое строки изменилось, хотя проблема остается прежней.

string.inspect :

"\n\n\t\t\t\t\t\t\t\t\t" 
"Tricky Tuesdays with DJ John @ Blend" 
"\n\n\t\t\t\t\t\t\t\t\t" 
"Bladder Buster Challenge with DJ Sean @ Star Rock" 
"\n\n\t\t\t\t\t\t\t\t\t" 
"Classic Rock Tuesday @ 10D - Chennai" 
"\n\n\t\t\t\t\t\t\t\t\t" 
"Vodka Night with DJ John @ Blend" 
"\n\n\t\t\t\t\t\t\t\t\t" 
"\"BOLLYWOOD WEDNESDAYS\" with DJ D Nash @ Candy Club" 
"\n\n\t\t\t\t\t\t\t\t\t" 
"RE - LAUNCH WEDNESDAY LADIES NIGHT @ ZODIAC" 
"\n\n\t\t\t\t\t\t\t\t\t" 
"Ladies Night @ 10 D - Chennai" 
"\n\n\t\t\t\t\t\t\t\t\t" 
"Wednesday Mayhem @ Dublin" 
"\n\n\t\t\t\t\t\t\t\t\t" 
+3

Можете вы заменить "\ n \ n" -> "\ n"? Или даже лучше "\ n +" -> "\ n"? – nhahtdh

+0

Да, я пробовал 'gsub (" \ n + "," ")' и 'gsub (/ \ n \ n /," \ n ")', они не работают. – arvindravi

+0

@arvindravi Пожалуйста, разместите результат '.inspect' на вашей строке. – Phrogz

ответ

0

Попробуйте

/^\n/ 

и заменить на пустую строку.

Вы уверены, что ваш символ новой строки только \n? Если бы не попробовать

/^\r?\n/ 

, чтобы также последовательность LineBreak \r\n.

+0

попробовал, кажется, не работает, я получаю тот же результат. – arvindravi

2

Прежде всего, ваш код удаляет все новые строки, а не только пустые - это не похоже на то, что вы хотите.

Во-вторых, операционные системы исторически не согласились о том, как представлять новые строки - старые компьютеры Mac используются \r для новых линий, Linux и OSX использовать \n и Windows, использует комбо \r\n. Поэтому вы действительно хотите заменить последовательные \r и \n s (указывая пустую строку там) с помощью одного \n.

+0

OS - Linux - Fedora 17 Я пробовал 'gsub/\ r + /," \ r "' и 'gsub/\ n + /," \ n "' и до сих пор не повезло. – arvindravi

+0

Не заканчиваются ли окончания строк в '\ n', когда файл открывается в текстовом режиме? –

+0

@MatheusMoreira Не файл, я создаю скребок, который генерирует эту строку, которая изменяется в соответствии со страницей, поэтому я просто пытаюсь избавиться от этих пустых/пустых строк. – arvindravi

4

Вот мое решение:

text.gsub(/\n+|\r+/, "\n").squeeze("\n").strip 
3

Это удаляет все последовательные пустые строки:

result = s.squeeze("\r\n").gsub(/(\r\n)+/, "\r\n") 

или опции командной строки без Ruby:

grep -v "^$" <file> 
+0

'' a \ r \ n \ r \ n \ r \ nb ".squeeze (" \ r \ n "). gsub (" \ r \ n \ r \ n "," \ r \ n ") # =>" a \ r \ n \ r \ nb "' Это потому, что 'gsub' не включает результаты замены при повторном поиске. Вам понадобится что-то вроде 'result = s.squeeze (...). Tap {| s2 | : go while s2.gsub! ("\ r \ n \ r \ n", "\ r \ n")} ' – Phrogz

+0

Ок интересно, не знал этого. Таким образом, вы фактически подразумевали, что мое решение не поддерживает окончание строк Windows. –

+0

Упс! Да, логическая инверсия :) – Phrogz

0

Вот уродливый хак на основе @ Ответ Тома:

result = s.squeeze("\r\n").tap{ |s2| :go while s2.gsub!("\r\n\r\n","\r\n") } 

Он поддерживает DOS (\r\n), Unix (\n) и MacOS 9- (\r).Проверено:

[ "\r\n", "\n", "\r" ].each do |marker| 
    1.upto(5) do |lines| 
    s = "a#{marker*lines}b" 
    tight = s.squeeze("\r\n").tap{ |s2| :go while s2.gsub!("\r\n\r\n","\r\n") } 
    puts "%24s -> %s" % [s.inspect, tight.inspect] 
    end 
end 
#=>     "a\r\nb" -> "a\r\nb" 
#=>    "a\r\n\r\nb" -> "a\r\nb" 
#=>   "a\r\n\r\n\r\nb" -> "a\r\nb" 
#=>  "a\r\n\r\n\r\n\r\nb" -> "a\r\nb" 
#=> "a\r\n\r\n\r\n\r\n\r\nb" -> "a\r\nb" 
#=>     "a\nb" -> "a\nb" 
#=>     "a\n\nb" -> "a\nb" 
#=>    "a\n\n\nb" -> "a\nb" 
#=>    "a\n\n\n\nb" -> "a\nb" 
#=>   "a\n\n\n\n\nb" -> "a\nb" 
#=>     "a\rb" -> "a\rb" 
#=>     "a\r\rb" -> "a\rb" 
#=>    "a\r\r\rb" -> "a\rb" 
#=>    "a\r\r\r\rb" -> "a\rb" 
#=>   "a\r\r\r\r\rb" -> "a\rb" 

Обратите внимание, что это предполагает, что ваши пустые строки действительно пустой, и не имеют каких-либо пробелов на них. Если это так, то вы можете сделать предварительный пропуск s.gsub(/^[ \t]+$/,'')

1

.split(/\n/).reject{ |l| l.chomp.empty? }.join("\n")

только для Unix стиле:

.split(/\n/).reject(&:empty?).join("\n")

удаляет пробельные строки тоже (метод Unix, Rails):

.split(/\n/).reject(&:blank?).join("\n")

1

Вот одно регулярное выражение, которое удаляет все bl ANK линии, в том числе в начале или в конце файла, включая строки, содержащие только пробелы или вкладок, и позволяет для всех трех форм конца строки маркеров (\r\n, \n и \r):

def remove_blank_lines(str, line_ending="\n") 
    str.gsub(/(?<=\A|#{line_ending})[ \t]*(?:#{line_ending}|\z)/,'') 
end 

Испытано :

[ "\r\n", "\n", "\r" ].each do |marker| 
    puts '='*70, "Lines ending with: #{marker.inspect}", '='*70 
    [ "", " ", "\t", " \t", "\t " ].each do |whitespace| 
    0.upto(2) do |lines| 
     blank_lines = "#{whitespace}#{marker*lines}" 
     s = "#{marker*lines}a#{marker*lines}b#{blank_lines}c#{blank_lines}" 
     tight = remove_blank_lines(s, marker) 
     puts "%43s -> %s" % [s.inspect, tight.inspect] 
    end 
    end 
end 

#=> ====================================================================== 
#=> Lines ending with: "\r\n" 
#=> ====================================================================== 
#=>          "abc" -> "abc" 
#=>      "\r\na\r\nb\r\nc\r\n" -> "a\r\nb\r\nc\r\n" 
#=>  "\r\n\r\na\r\n\r\nb\r\n\r\nc\r\n\r\n" -> "a\r\nb\r\nc\r\n" 
#=>          "ab c " -> "ab c " 
#=>      "\r\na\r\nb \r\nc \r\n" -> "a\r\nb \r\nc \r\n" 
#=>  "\r\n\r\na\r\n\r\nb \r\n\r\nc \r\n\r\n" -> "a\r\nb \r\nc \r\n" 
#=>         "ab\tc\t" -> "ab\tc\t" 
#=>     "\r\na\r\nb\t\r\nc\t\r\n" -> "a\r\nb\t\r\nc\t\r\n" 
#=> "\r\n\r\na\r\n\r\nb\t\r\n\r\nc\t\r\n\r\n" -> "a\r\nb\t\r\nc\t\r\n" 
#=>         "ab \tc \t" -> "ab \tc \t" 
#=>     "\r\na\r\nb \t\r\nc \t\r\n" -> "a\r\nb \t\r\nc \t\r\n" 
#=> "\r\n\r\na\r\n\r\nb \t\r\n\r\nc \t\r\n\r\n" -> "a\r\nb \t\r\nc \t\r\n" 
#=>         "ab\t c\t " -> "ab\t c\t " 
#=>     "\r\na\r\nb\t \r\nc\t \r\n" -> "a\r\nb\t \r\nc\t \r\n" 
#=> "\r\n\r\na\r\n\r\nb\t \r\n\r\nc\t \r\n\r\n" -> "a\r\nb\t \r\nc\t \r\n" 
#=> ====================================================================== 
#=> Lines ending with: "\n" 
#=> ====================================================================== 
#=>          "abc" -> "abc" 
#=>        "\na\nb\nc\n" -> "a\nb\nc\n" 
#=>      "\n\na\n\nb\n\nc\n\n" -> "a\nb\nc\n" 
#=>          "ab c " -> "ab c " 
#=>        "\na\nb \nc \n" -> "a\nb \nc \n" 
#=>      "\n\na\n\nb \n\nc \n\n" -> "a\nb \nc \n" 
#=>         "ab\tc\t" -> "ab\tc\t" 
#=>       "\na\nb\t\nc\t\n" -> "a\nb\t\nc\t\n" 
#=>     "\n\na\n\nb\t\n\nc\t\n\n" -> "a\nb\t\nc\t\n" 
#=>         "ab \tc \t" -> "ab \tc \t" 
#=>       "\na\nb \t\nc \t\n" -> "a\nb \t\nc \t\n" 
#=>     "\n\na\n\nb \t\n\nc \t\n\n" -> "a\nb \t\nc \t\n" 
#=>         "ab\t c\t " -> "ab\t c\t " 
#=>       "\na\nb\t \nc\t \n" -> "a\nb\t \nc\t \n" 
#=>     "\n\na\n\nb\t \n\nc\t \n\n" -> "a\nb\t \nc\t \n" 
#=> ====================================================================== 
#=> Lines ending with: "\r" 
#=> ====================================================================== 
#=>          "abc" -> "abc" 
#=>        "\ra\rb\rc\r" -> "a\rb\rc\r" 
#=>      "\r\ra\r\rb\r\rc\r\r" -> "a\rb\rc\r" 
#=>          "ab c " -> "ab c " 
#=>        "\ra\rb \rc \r" -> "a\rb \rc \r" 
#=>      "\r\ra\r\rb \r\rc \r\r" -> "a\rb \rc \r" 
#=>         "ab\tc\t" -> "ab\tc\t" 
#=>       "\ra\rb\t\rc\t\r" -> "a\rb\t\rc\t\r" 
#=>     "\r\ra\r\rb\t\r\rc\t\r\r" -> "a\rb\t\rc\t\r" 
#=>         "ab \tc \t" -> "ab \tc \t" 
#=>       "\ra\rb \t\rc \t\r" -> "a\rb \t\rc \t\r" 
#=>     "\r\ra\r\rb \t\r\rc \t\r\r" -> "a\rb \t\rc \t\r" 
#=>         "ab\t c\t " -> "ab\t c\t " 
#=>       "\ra\rb\t \rc\t \r" -> "a\rb\t \rc\t \r" 
#=>     "\r\ra\r\rb\t \r\rc\t \r\r" -> "a\rb\t \rc\t \r" 
0

Это будет делать это: .gsub(/(\n\s*\n)+/, "\n")

и заменить \n в регулярном выражении с [\n|\r ] если нужно.

Смежные вопросы