2009-03-02 9 views

Odpowiedz

84

String#each_line

str.each_line do |line| 
    #do something with line 
end 
+3

Ty potworze! kocham to –

19

Co powiedział Iraimbilanja.

Albo można podzielić ciąg na nowe linie:

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

Pamiętaj, że each_line utrzymuje znaki linię zasilającą, podczas split je zjada.

Uwaga: użyte w tym miejscu wyrażenie regularne zajmie się wszystkimi trzema formatami zakończenia linii. String#each_line oddziela wiersze od opcjonalnego argumentu sep_string, który domyślnie jest $/, który domyślnie jest ustawiony na "\n".

Na koniec, jeśli chcesz wykonać bardziej złożone analizowanie ciągów, sprawdź wbudowaną klasę StringScanner.

3

Można również zrobić z każdym z wzoru:

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 

myślę, że to powinno zająć się nowymi liniami.

+1

To nie zadziała. Łańcuch # each_line bez bloku zwraca moduł wyliczający, który nie odpowiada na chomp. Beyond chomp nie bierze bloku. – Chuck

+1

Coś takiego jak 'str.each_line.map (&: chomp) .each do | line | ...' zrobiłoby to, ale równie dobrze możesz to zrobić w iteracji 'each_line' jako pojedyncze przejście. – jwadsack