2015-05-14 23 views

Trả lời

23

Bạn có thể sử dụng một cái gì đó như:

var_name.gsub!(/\s+/, '') 

Hoặc, nếu bạn muốn trả về chuỗi đã thay đổi, thay vì sửa đổi biến,

var_name.gsub(/\s+/, '') 

này cũng sẽ cho phép bạn chuỗi nó với khác các phương thức (ví dụ: something_else = var_name.gsub(...).to_i để tách khoảng trắng rồi chuyển đổi nó thành số nguyên). gsub! sẽ chỉnh sửa tại chỗ, vì vậy bạn phải viết var_name.gsub!(...); something_else = var_name.to_i. Nói đúng, miễn là có ít nhất một thay đổi được thực hiện, gsub! sẽ trả lại phiên bản mới (tức là cùng một điều gsub sẽ trả về), nhưng nếu bạn nhận được chuỗi không có khoảng trắng, nó sẽ trả về nil và mọi thứ sẽ phá vỡ. Do đó, tôi thích gsub nếu bạn đang sử dụng các phương pháp chuỗi.

gsub hoạt động bằng cách thay thế bất kỳ đối sánh nào của đối số đầu tiên bằng đối số thứ hai nội dung. Trong trường hợp này, nó khớp với bất kỳ chuỗi ký tự khoảng trống liên tiếp nào (hoặc chỉ một ký tự đơn) với regex /\s+/, sau đó thay thế các ký tự có chuỗi rỗng. Ngoài ra còn có một hình thức khối nếu bạn muốn làm một số chế biến trên một phần phù hợp, thay vì chỉ thay thế trực tiếp; xem String#gsub để biết thêm thông tin về điều đó.

Tài liệu Ruby cho lớp Regexp là điểm khởi đầu tốt để tìm hiểu thêm về biểu thức chính quy - Tôi thấy rằng chúng hữu ích trong nhiều tình huống khác nhau, trong đó một vài mili giây đếm và bạn không cần phải phù hợp với những thứ có thể được lồng nhau một cách tùy tiện.

Như Gene đề xuất trong comment của mình, bạn cũng có thể sử dụng tr:

var_name.tr(" \t\r\n", '') 

Nó hoạt động theo cách tương tự, nhưng thay vì thay thế một regex, nó thay thế tất cả các thể hiện của các n nhân vật thứ của đối số đầu tiên trong chuỗi được gọi với ký tự thứ n của thông số thứ hai hoặc nếu không có, không có gì. Xem String#tr để biết thêm thông tin.

1

Hoặc bạn có thể scan chuỗi cho chữ số /\d+/join kết quả:

string = "123\n\n12312313\n\n123 1231 1231 1\n" 

string.scan(/\d+/).join 
#=> "12312312313123123112311" 

Xin lưu ý rằng điều này cũng sẽ loại bỏ ký tự chữ cái, dấu gạch ngang, biểu tượng, về cơ bản tất cả mọi thứ đó không phải là một chữ số.

+0

tôi muốn chỉ ra rằng điều này có thể kết thúc bằng cách sử dụng khá nhiều bộ nhớ nếu bạn có một danh sách rất dài các số để loại bỏ khoảng trắng, vì nó đầu tiên phải xây dựng một mảng của mỗi lần xuất hiện, sau đó nó tham gia. Tôi nghĩ rằng nó cũng chậm hơn một chút, vì nó lặp lại qua hai lần, mặc dù tôi không biết về điều đó. –

4

Bạn cũng có thể sử dụng String#delete:

str = "123\n12312313\n\n123 1231 1231 1" 

str.delete "\s\n" 
    #=> "12312312313123123112311" 

Bạn có thể sử dụng để thay đổi String#delete!str tại chỗ, nhưng lưu ý delete! lợi nhuận nil nếu không thay đổi được thực

+0

@ndn, gợi ý tốt. Cảm ơn. (Người đọc: Tôi trước đây có 'srr.tr" \ s \ n "," "'.) –

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