2012-11-24 38 views
28

Làm thế nào tôi có thể viết một hàm Ruby tách đầu vào bằng bất kỳ khoảng trắng nào và loại bỏ tất cả khoảng trắng khỏi kết quả? Ví dụ: nếu dữ liệu nhập làRuby chia cho khoảng trắng

aa bbb 
cc dd ee 

Sau đó trả lại mảng ["aa", "bbb", "cc", "dd", "ee"].

Trả lời

35

Sau đây nên làm việc cho ví dụ bạn đưa ra:

str.gsub(/\s+/m, ' ').strip.split(" ") 

nó sẽ trả về:

["aa", "bbb", "cc", "dd", "ee"] 

Ý nghĩa của mã:

/\s+/m là phần phức tạp hơn. \s có nghĩa là khoảng trắng, vì vậy \s+ có nghĩa là một quặng có nhiều ký tự trắng hơn. Trong phần /m, m được gọi là công cụ sửa đổi, trong trường hợp này có nghĩa là, nhiều dòng, có nghĩa là truy cập nhiều dòng chứ không phải chỉ là một hành vi mặc định. Vì vậy, /\s+/m có nghĩa là, tìm các chuỗi của một hoặc nhiều khoảng trắng.

gsub có nghĩa là thay thế tất cả.

strip tương đương với trim bằng các ngôn ngữ khác và xóa khoảng trắng khỏi mặt trước và cuối chuỗi.

Như tôi đã viết giải thích, có thể là trường hợp bạn kết thúc với ký tự cuối dòng ở cuối hoặc đầu chuỗi.

Để được an toàn

Mã này có thể được viết như sau:

str.gsub(/\s+/m, ' ').gsub(/^\s+|\s+$/m, '').split(" ") 

Vì vậy, nếu bạn có:

str = "\n  aa bbb\n cc dd ee\n\n" 

Sau đó, bạn sẽ nhận được:

["aa", "bbb", "cc", "dd", "ee"] 

Ý nghĩa của mã mới:

^\s+ một chuỗi các không gian màu trắng ở phần đầu của chuỗi

\s+$ một chuỗi các không gian màu trắng ở phần cuối của chuỗi

Vì vậy gsub(/^\s+|\s+$/m, '') phương tiện loại bỏ bất kỳ chuỗi trắng không gian ở đầu chuỗi và ở cuối chuỗi.

+0

Cảm ơn bạn đã trả lời, Candide! Bạn (hoặc bất kỳ ai) có thể đưa ra lời giải thích ngắn gọn về mã của bạn không? –

+0

@JJBeck vui lòng xem cập nhật. – Candide

+0

Rubocop không chia nhỏ của bạn ("") vì dấu ngoặc kép. – ablarg

19
input = <<X 
    aa bbb 
cc dd ee 
X 

input.strip.split(/\s+/) 
+0

Ồ, điều này rất đơn giản, cảm ơn! –

5
input.split("\s") 

Nếu "\s" được sử dụng thay vì /\s/, da trắng-những tốc độ sẽ bị xoá khỏi kết quả.

+0

Không thể tìm thấy trong tài liệu. – Nakilon

5

Như một sửa đổi nhỏ đối với câu trả lời của Vidaica, trong Ruby 2.1.1 có vẻ như

input.split(" ") 

sẽ bù đắp cho tất cả các khoảng trắng, có thể là không gian, các tab, hoặc dòng mới, năng suất:

["aa", "bbb", "cc", "dd", "ee"] 
37

Đây là hành vi mặc định của String#split:

input = <<-TEXT 
aa bbb 
cc dd ee 
TEXT 

input.split 

Kết quả:

["aa", "bbb", "cc", "dd", "ee"] 

Tính năng này hoạt động trong tất cả các phiên bản Ruby mà tôi đã thử nghiệm, bao gồm 1.8.7, 1.9.3, 2.0.0 và 2.1.2.

+0

Vì vậy, nhiều câu trả lời phức tạp và câu trả lời đơn giản là tốt nhất! – toxaq

+0

Đây sẽ là câu trả lời tốt nhất cho tất cả các phiên bản ruby ​​mới nhất. Vào thời điểm này câu hỏi này được hỏi (2012) Tôi không nghĩ rằng nó có thể làm điều đó theo cách này, mà giải thích các "câu trả lời phức tạp". – Shashank

+0

@Shashank Vâng, như tôi đã đề cập trong câu trả lời tôi đã thử nghiệm điều này với Ruby 1.8.7, 1.9.3, 2.0.0 và 2.1.2, và tất cả chúng đều hoạt động chính xác như được hiển thị ở đây. 1.8.7 đã được tất cả các con đường trở lại trong năm 2008, do đó, ngay cả khi câu trả lời này đã được hỏi không có lý do OP không thể chỉ sử dụng 'String # split'. Không có lý do tại sao không ai nói rằng cho đến bây giờ ... – Ajedi32

Các vấn đề liên quan