Câu hỏi Ruby chức năng để loại bỏ tất cả các khoảng trắng?


Hàm Ruby cần xóa là gì tất cả các không gian trắng? Loại like php trim()?


483
2017-10-28 01:53


gốc


Câu hỏi của bạn không rõ ràng: Bạn có muốn xóa tất cả khoảng trắng hoặc bạn muốn loại bỏ khoảng trống đầu và cuối không? - Sinan Ünür
PHP trim() dải khoảng trắng "từ đầu và cuối chuỗi"(như đã nêu trong tài liệu), nó không xóa "tất cả khoảng trắng". - Tadeck
Khi nghi ngờ, hãy xem tài liệu trực tuyến của Ruby cho lớp String (xem .strip bên dưới). - Merovex
Lưu ý rằng tất cả các câu trả lời sử dụng String#strip hoặc khớp /\s+/ sẽ chỉ xóa khoảng trống ASCII. Nếu bạn muốn đảm bảo bất kỳ khoảng trống không phải ASCII nào cũng được nắm bắt (ví dụ: HTML &nbsp) xem câu trả lời kỳ lạ không được ưa chuộng từ @EBooker. - MatzFan


Các câu trả lời:


Nếu bạn chỉ muốn xóa khoảng trắng đầu và cuối (như cắt trang PHP), bạn có thể sử dụng .strip, nhưng nếu bạn muốn xóa tất cả các khoảng trắng, bạn có thể sử dụng .gsub(/\s+/, "") thay thế .


754
2017-10-28 02:13



Có "/ \ s + /" khoảng trống trung bình đơn giản không? - Rails beginner
\ s + có nghĩa là 1 hoặc nhiều ký tự khoảng trắng (dấu cách, dòng mới, tab). // Xung quanh cho thấy đó là một biểu thức chính quy. - dylanfm
Điều này không tương đương với trim () - Brett Holt
dải là chính xác những gì tôi đang tìm kiếm, cảm ơn cho câu hỏi tốt và awnser! - Francois
@BrettHolt Biểu thức gsub không giống như trim, nhưng người hỏi bao gồm cụm từ "tất cả khoảng trắng", không giống như cắt. Vì vậy, tôi đã đưa ra lựa chọn thay thế. - joel.neely


s = "I have white space".delete(' ')

Và để mô phỏng PHP trim() chức năng:

s = "   I have leading and trailing white space   ".strip

440
2017-10-28 01:54



điều này dễ đọc hơn nhiều so với regex, tại sao nó không phổ biến? - ckarbass
@ckarbass: Bởi vì nhiều người thích các giải pháp quá phức tạp cho các vấn đề đơn giản. Nó biến mất với kinh nghiệm. - Ed S.
@ckarbass @Ed S. Nó không phải là phổ biến bởi vì nó không giống nhau. Câu hỏi ban đầu được sử dụng cụm từ "tất cả khoảng trống", bao gồm các tab, dòng mới, v.v. Câu trả lời được đề xuất này sẽ không xóa các ký tự khoảng trống khác đó. Đối với "quá phức tạp", tôi đề nghị so sánh biểu thức chính quy đơn giản với .delete(' ').delete('\t').delete('\n') ..., quá chi tiết và cung cấp nhiều cơ hội cho lỗi chính tả và lỗi thiếu sót. - joel.neely
@ joel.neely: Tôi trả lời câu hỏi này một thời gian dài trước đây, nhưng đọc câu hỏi một lần nữa, lần này cẩn thận hơn. OP đã yêu cầu "một hàm để xóa tất cả khoảng trắng", nhưng sau đó được yêu cầu "một cái gì đó giống như trang trí của PHP ()". Vì vậy, có một chút khó khăn để biết chính xác những gì họ muốn ở đây. trim() chắc chắn không xóa các dòng mới và các ký tự trắng khác. Bạn đang chọn một giải thích cho một câu hỏi mơ hồ. - Ed S.
@ joel.neely: Điều đó nói rằng, tôi đồng ý rằng một giải pháp vượt ra ngoài việc giải thích theo nghĩa đen của câu hỏi là một giải pháp tốt hơn trong trường hợp này (tức là, một regex xóa tất cả các ký tự sẽ tạo thành khoảng trắng thay vì một chuỗi delete() cuộc gọi.) - Ed S.


Câu trả lời liên quan:

"   clean up my edges    ".strip

trả về

"clean up my edges"

151
2017-10-28 01:54



Đó là cái tôi quên mất. Tôi biết có một phương pháp để loại bỏ khoảng trắng mà sẽ làm như vậy theo mặc định nếu không có đối số được thông qua. +1 - Ed S.
Điều này tương đương với trim. Vui lòng tham khảo báo giá từ @Tadeck ở trên. - Brett Holt
Nếu có khả năng biến đó là nil, hãy chắc chắn để chạy .to_s trước khi chạy dải sao cho phương thức dải không gây ra lỗi. Ví dụ str=nil; str.to_s.strip #=> "" - scarver2
Tôi thích some_data.strip! nếu some_data.is_a? Chuỗi - slindsey3000


String#strip - xóa tất cả khoảng trắng từ đầu và cuối.

String#lstrip - ngay từ đầu.

String#rstrip - chỉ từ cuối.

String#chomp (không có đối số) - xóa dấu tách dòng (\n hoặc là \r\n) từ cái kết.

String#chop - xóa ký tự cuối cùng.

String#delete - - x.delete(" \t\r\n") - xóa tất cả khoảng trống được liệt kê.

String#gsub - - x.gsub(/[[:space:]]/, '') - xóa tất cả khoảng trắng, bao gồm unicode ones.


chú thích: Tất cả các phương thức trên trả về một chuỗi mới thay vì thay đổi nguyên gốc. Nếu bạn muốn thay đổi chuỗi tại chỗ, hãy gọi phương thức tương ứng với ! cuối cùng.


87
2018-05-10 20:23



Ví dụ String # delete xuất hiện để sử dụng regex, nhưng \s là dấu ngoặc kép thay vì dấu gạch chéo. Ngoài ra tôi không thể tìm thấy bất kỳ đề cập trong tài liệu mà xóa có thể mất một regex như một đối số. - slothbear
@slothbear, nó không phải là một regex, đó là một tập hợp nhỏ các mẫu giống với các regex. Đối với tài liệu #delete được cho là hoạt động tương tự như #count. Bạn có thể thử nó trong giao diện điều khiển là tốt. - ndn
Cảm ơn vì đã dạy tôi điều gì đó mới mẻ. Và cũng nhờ lời nhắc để thử những điều trong bối cảnh nhỏ nhất có thể (dòng lệnh). - slothbear
@slothbear, trong khi điều về #delete các mẫu là đúng, \s nói chung chỉ đề cập đến không gian: "\s" == ' ' # => true. Do đó các phiên bản trước đó chỉ loại bỏ không gian. Đã cập nhật câu trả lời của tôi. - ndn
xóa trả về nil khi không tìm thấy không gian. - juliangonzalez


"1232 23 2 23 232 232".delete(' ')
=> "123223223232232"

Xóa tác phẩm nhanh hơn =)

user         system     total      real
gsub, s      0.180000   0.010000   0.190000 (0.193014)
gsub, s+     0.200000   0.000000   0.200000 (0.196408)
gsub, space  0.220000   0.000000   0.220000 (0.222711)
gsub, join   0.200000   0.000000   0.200000 (0.193478)
delete       0.040000   0.000000   0.040000 (0.045157)

86
2017-07-04 11:55



Phản ứng tuyệt vời. Cảm ơn bạn đã làm điểm chuẩn. - Alan Andrade
nhưng điều này chỉ xóa spaces, không phải tất cả white spaces - Gavriel


Bạn có thể dùng squish phương pháp. Nó loại bỏ không gian màu trắng trên cả hai đầu của chuỗi và nhóm nhiều không gian màu trắng thành không gian đơn.

Ví dụ:

" a  b  c ".squish

sẽ dẫn đến:

"a b c"

Kiểm tra tài liệu tham khảo này từ api.rubyonrails.org.

CHỈNH SỬA: Nó chỉ hoạt động đối với ruby ​​trên đường ray


73
2017-10-17 10:51



Lưu ý rằng câu trả lời chỉ liên kết được khuyến khích, SO câu trả lời nên là điểm cuối của một tìm kiếm cho một giải pháp (so với một điểm dừng khác của tài liệu tham khảo, mà có xu hướng để có được cũ theo thời gian). Vui lòng xem xét thêm bản tóm tắt độc lập tại đây, giữ liên kết dưới dạng tham chiếu. - kleopatra
Tôi nghĩ câu trả lời này đã được giải thích đầy đủ và thực tế là liên kết đã được tham chiếu vì câu trả lời chính nó đã được giải thích rõ ràng. Chức năng này tốt, cảm ơn - ksugiarto
điều này chỉ hoạt động trong ruby ​​trên đường ray - Nicolas Garnil
Đây là từ ActiveSupport. Bạn không cần tất cả Rails để sử dụng nó, nhưng bạn cần ít nhất ActiveSupport và một require 'active_support/core_ext/string/filters' - Justin Force


Hơi trễ một chút, nhưng bất kỳ ai khác googling trang này có thể quan tâm đến phiên bản này -

Nếu bạn muốn dọn dẹp một đoạn văn bản được định dạng trước mà người dùng có thể đã cắt và dán vào ứng dụng của bạn bằng cách nào đó, nhưng vẫn giữ khoảng cách từ, hãy thử cách này:

content = "      a big nasty          chunk of     something

that's been pasted                        from a webpage       or something        and looks 

like      this

"

content.gsub(/\s+/, " ").strip

#=> "a big nasty chunk of something that's been pasted from a webpage or something and looks like this"

46
2018-01-18 11:58



Người ta cũng có thể sử dụng Rails ' squish phương pháp: apidock.com/rails/String/squish - Phillip Koebbe
Hoặc nếu bạn không có Rails và bạn không có dòng mới, squeeze(" ") có thể làm việc. - Andrew Grimm


Ruby's .strip phương thức thực hiện tương đương PHP trim().

Để xóa tất cả khoảng trắng:

"  leading    trailing   ".squeeze(' ').strip
=> "leading trailing"

@Tass làm cho tôi biết rằng câu trả lời ban đầu của tôi loại bỏ các chữ cái trùng lặp liên tiếp - YUCK! Tôi đã chuyển sang phương pháp squish thông minh hơn về các sự kiện như vậy nếu sử dụng khung Rails.

require 'active_support/all'
"  leading    trailing   ".squish
=> "leading trailing"

"  good    men   ".squish
=> "good men"

Trích dẫn: http://apidock.com/rails/String/squish


43
2018-05-08 07:21



Thao tác này sẽ xóa các ký tự trùng lặp "đã tham gia". "good men".squeeze.strip sẽ trở lại "god men" - Tass
Cảm ơn bạn đã chỉ ra rằng @Tass. Tôi đã chỉnh sửa câu trả lời của tôi ủng hộ phương pháp squish. - scarver2
+1 cho "các chữ cái trùng lặp liên tiếp". Tôi không thể đưa ra một cách để mô tả kịch bản. Làm tốt! :-) - Tass


" Raheem Shaik ".strip

Nó sẽ loại bỏ không gian bên trái và bên phải. Mã này sẽ cung cấp cho chúng tôi: "Raheem Shaik"


25
2017-10-02 06:08





Cũng đừng quên:

$ s = "   I have white space   ".split
=> ["I", "have", "white", "space"]

20
2017-10-28 01:58



Vì vậy, s.split.join sẽ thực hiện công việc. - Piotr Brudny
Điều này là tốt đẹp khi lặp: [" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"] - tbloncar