2009-03-02 9 views

Trả lời

84

String#each_line

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

Bạn quái vật! yêu nó –

19

gì Iraimbilanja nói.

Hoặc bạn có thể chia chuỗi ở dòng mới:

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

Ghi chú rằng each_line giữ chars thức ăn đường, trong khi split ăn chúng.

Lưu ý regex tôi đã sử dụng ở đây sẽ xử lý tất cả ba định dạng kết thúc dòng. String#each_line phân tách các dòng theo đối số tùy chọn sep_string, mặc định là $/, chỉ mặc định là "\n".

Cuối cùng, nếu bạn muốn thực hiện phân tích cú pháp chuỗi phức tạp hơn, hãy xem lớp StringScanner tích hợp sẵn.

3

Bạn cũng có thể làm với với bất kỳ mẫu:

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 

Tôi nghĩ rằng đây nên chăm sóc của dòng mới.

+1

Điều đó sẽ không hiệu quả. String # each_line không có một khối trả về một Enumerator, mà không đáp ứng với chomp. Ngoài chomp không mất một khối. – Chuck

+1

Một cái gì đó như 'str.each_line.map (&: chomp) .each do | line | ...' sẽ làm điều đó, nhưng bạn cũng có thể làm điều đó trong phép lặp 'each_line' như một lần truyền. – jwadsack