Sự khác biệt giữa tr và gsub là gì?


133

Tôi đã đọc tài liệu Ruby và bị nhầm lẫn với sự khác biệt giữa gsubtr. Sự khác biệt giữa hai là gì?


8
Tôi tìm thấy câu hỏi này vì RuboCop đã cảnh báo về việc sử dụng gsub của tôi - tôi nghĩ các câu trả lời dưới đây giải thích rõ câu trả lời, về cơ bản đó là sự khác biệt giữa gsub và tr.
JohnK

Câu trả lời:


180

Sử dụng trkhi bạn muốn thay thế (dịch) các ký tự đơn.

trkhớp với các ký tự đơn (không thông qua biểu thức chính quy), do đó, các ký tự không cần xảy ra theo cùng một thứ tự trong đối số chuỗi đầu tiên. Khi tìm thấy một ký tự, nó được thay thế bằng ký tự được tìm thấy tại cùng một chỉ mục trong đối số chuỗi thứ hai:

'abcde'.tr('bda', '123')
#=> "31c2e"

'abcde'.tr('bcd', '123')
#=> "a123e"

Sử dụng gsubkhi bạn cần sử dụng biểu thức chính quy hoặc khi bạn muốn thay thế các chuỗi con dài hơn:

'abcde'.gsub(/bda/, '123')
#=> "abcde"

'abcde'.gsub(/b.d/, '123')
#=> "a123e"

48
Bit của bối cảnh: tên trcó nghĩa là "dịch", như trong "dịch ký tự", đó chính xác là những gì nó làm. Nó được đặt tên theo tiện ích Unix cùng tên (vốn nổi tiếng với tên ngắn và tối nghĩa).
Martin Tournoij

40
  • trchỉ có thể thay thế một ký tự bằng một ký tự cố định duy nhất (mặc dù bạn có thể đặt nhiều kết quả khớp loại này trong một trcuộc gọi) nhưng rất nhanh.
  • gsubcó thể khớp các mẫu phức tạp bằng regex và thay thế bằng kết quả tính toán phức tạp, nhưng chậm hơn tr.

9
Đúng vậy. Khi cả hai công việc trnhanh hơn nhiều lần gsub. Đây là một tiêu chuẩn về cách nhanh hơn trcó thể hơn gsub. github.com/JuanitoFatas/fast-ruby/blob/master/code/opes/
Kẻ

9

trtrả về một bản sao strvới các ký tự được from_strthay thế bằng các ký tự tương ứng trong to_str. Nếu to_strngắn hơn from_str, nó được đệm với ký tự cuối cùng của nó để duy trì sự tương ứng. http://apidock.com/ruby/String/tr

gsubtrả về một bản sao strvới tất cả các lần xuất hiện của mẫu được thay thế cho đối số thứ hai. Các mô hình thường là một Regapi; nếu được đưa ra dưới dạng Chuỗi, mọi ký tự biểu thức chính quy mà nó chứa sẽ được hiểu theo nghĩa đen, ví dụ: \dsẽ khớp với phản ứng ngược theo sau d, thay vì chữ số. http://apidock.com/ruby/String/gsub

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.