Как удалить возврат каретки с помощью Ruby? - PullRequest
68 голосов
/ 13 ноября 2008

Я думал, что этот код будет работать, но регулярное выражение никогда не совпадает с \ r \ n. Я просмотрел данные, которые я читаю, в шестнадцатеричном редакторе и убедился, что в файле действительно есть шестнадцатеричный D и шестнадцатеричный шаблон.

Я также пытался использовать регулярные выражения / \ xD \ xA / m и / \ x0D \ x0A / m, но они также не совпадали.

Это мой код прямо сейчас:

   lines2 = lines.gsub( /\r\n/m, "\n" )
   if ( lines == lines2 )
       print "still the same\n"
   else
       print "made the change\n"
   end

В дополнение к альтернативам было бы неплохо узнать, что я делаю неправильно (для облегчения некоторого обучения с моей стороны). :)

Ответы [ 14 ]

159 голосов
/ 17 августа 2011

Использование Строка # strip

Возвращает копию строки с удаленными начальными и конечными пробелами.

1009 * например *

"    hello    ".strip   #=> "hello"   
"\tgoodbye\r\n".strip   #=> "goodbye"

Использование gsub

string = string.gsub(/\r/," ")
string = string.gsub(/\n/," ")
35 голосов
/ 13 ноября 2008

Обычно, когда я имею дело с разбором \ r или \ n, я буду искать оба варианта, делая что-то вроде

lines.gsub(/\r\n?/, "\n");

Я обнаружил, что в зависимости от того, как были сохранены данные (используемая ОС, используемый редактор, отношение Юпитера к Ио в то время), может быть или не быть перевод строки после возврата каретки. Кажется странным, что вы видите оба символа в шестнадцатеричном режиме. Надеюсь, это поможет.

23 голосов
/ 13 ноября 2008

Что вы получаете, когда делаете puts lines? Это даст вам подсказку.

По умолчанию File.open открывает файл в текстовом режиме, поэтому ваши \r\n символы будут автоматически преобразованы в \n. Может быть, поэтому lines всегда равны lines2. Чтобы предотвратить синтаксический анализ концов строк в Ruby, используйте режим rb:

C:\> copy con lala.txt
a
file
with
many
lines
^Z

C:\> irb
irb(main):001:0> text = File.open('lala.txt').read
=> "a\nfile\nwith\nmany\nlines\n"
irb(main):002:0> bin = File.open('lala.txt', 'rb').read
=> "a\r\nfile\r\nwith\r\nmany\r\nlines\r\n"
irb(main):003:0>

Но из вашего вопроса и кода я вижу, что вам просто нужно открыть файл с модификатором по умолчанию. Вам не нужно конвертировать, и вы можете использовать более короткий File.read.

17 голосов
/ 17 января 2012
modified_string = string.gsub(/\s+/, ' ').strip
15 голосов
/ 26 февраля 2016

Если вы используете Rails, существует метод squish

"\tgoodbye\r\n".squish => "goodbye"

"\tgood \t\r\nbye\r\n".squish => "good bye"

15 голосов
/ 13 ноября 2008
lines2 = lines.split.join("\n")
14 голосов
/ 01 декабря 2011

"still the same\n".chomp
или
"still the same\n".chomp!

http://www.ruby -doc.org / ядро-1.9.3 / String.html # метод-я-Chomp

6 голосов
/ 13 ноября 2008

Как насчет следующего?

irb(main):003:0> my_string = "Some text with a carriage return \r"
=> "Some text with a carriage return \r"
irb(main):004:0> my_string.gsub(/\r/,"")
=> "Some text with a carriage return "
irb(main):005:0>

Или ...

irb(main):007:0> my_string = "Some text with a carriage return \r\n"
=> "Some text with a carriage return \r\n"
irb(main):008:0> my_string.gsub(/\r\n/,"\n")
=> "Some text with a carriage return \n"
irb(main):009:0>
2 голосов
/ 14 февраля 2018

Просто еще один вариант:

lines.delete(" \n")
2 голосов
/ 05 октября 2017

Я думаю, что ваше регулярное выражение почти завершено - вот что я бы сделал:

lines2 = lines.gsub(/[\r\n]+/m, "\n")

В приведенном выше описании я поместил \ r и \ n в класс (таким образом, не имеет значения, в каком порядке они могут появляться) и добавил квалификатор "+" (чтобы "\ r \ n \" r \ n \ r \ n "также будет совпадать один раз, и все это будет заменено на" \ n ")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...