2009-03-02 2 views

ответ

19

Что сказал ираймбиланья.

Или вы могли бы разделить строку на новые строки:

str.split(/\r?\n|\r/).each { |line| … } 

Осторожно, что each_line держит подающие линии символов, в то время как split ест их.

Обратите внимание, что регулярное выражение, которое я использовал здесь, позаботится обо всех трех форматах окончания строки. String#each_line разделяет строки на необязательный аргумент sep_string, который по умолчанию равен $/, который сам по умолчанию равен "\n".

Наконец, если вы хотите выполнить более сложный синтаксический анализ строк, ознакомьтесь со встроенным классом StringScanner.

3

Вы также можете сделать с любым рисунком:

str.scan(/\w+/) do |w| 
    #do something 
end 
-2
str.each_line.chomp do |line| 
    # do something with a clean line without line feed characters 
end 

Я думаю, что это должно заботиться о новой строке.

+1

Это не сработает. Строка # each_line без блока возвращает Enumerator, который не отвечает на chomp. Помимо chomp не берется блок. – Chuck

+1

Что-то вроде 'str.each_line.map (&: chomp) .each do | line | ...' сделал бы это, но вы могли бы также сделать это в итерации 'each_line' как один проход. – jwadsack