Sự khác biệt giữa các phương thức gsub và sub cho Ruby Strings là gì


111

Tôi đã xem xét tài liệu cho Stringngày hôm nay và tôi đã thấy :subphương pháp mà tôi chưa bao giờ nhận thấy trước đây. Tôi đã sử dụng :gsubvà có vẻ như chúng về cơ bản giống nhau. Bất cứ ai có thể giải thích sự khác biệt cho tôi? Cảm ơn!


Câu trả lời:


208

Viết gtắt của toàn cầu, thay thế cho toàn cầu (tất cả):

Trong irb:

>> "hello".sub('l', '*')
=> "he*lo"
>> "hello".gsub('l', '*')
=> "he**o"

13
Vâng. Giờ thì tôi đã hiểu. Để bảo vệ tôi, tôi không nghĩ điều này là quá rõ ràng ... Cho đến bây giờ, đó là.
Ryanmt,

15
Tôi đồng ý với bạn rằng nó không hiển nhiên! Java gọi chúng replacereplaceAll. Nhưng Ruby có nguồn gốc từ Perl sử dụng công cụ gsửa đổi. Nó chỉ là một trong những điều đó.
Ray Toal,

1
May mắn thay, bây giờ nó là hiển nhiên. Tôi sẽ biết trong tương lai.
Ryanmt

Bằng cách này, sublà nhanh hơn nhiều so với gsub, có một điểm chuẩn ở đây github.com/JuanitoFatas/fast-ruby/blob/master/code/string/...
JackXu

Tôi đang thấy một số hành vi khác với điều này: A, sentence, separated, by, commas".gsub!(/(.*),(.*)/,"\\2 \\1") => " commas A, sentence, separated, by" Bất kỳ suy nghĩ nào tại sao gsub!dường như chỉ tìm / thay thế trường hợp đầu tiên khi sử dụng nhóm regex?
Bennett Talpers

31

Sự khác biệt là subchỉ thay thế lần xuất hiện đầu tiên của mẫu được chỉ định, trong khi gsubnó thay thế cho tất cả các lần xuất hiện (nghĩa là nó thay thế toàn cục).


10
Nếu bạn trả lời sớm hơn một phút, có thể 1020 đại diện nữa sẽ là của bạn. :)
Andrew Grimm

3
value = "abc abc"
puts value                                # abc abc
# Sub replaces just the first instance.
value = value.sub("abc", "---")
puts value                                # --- abc
# Gsub replaces all instances.
value = value.gsub("abc", "---")
puts value                                # --- ---

-2

subgsubthực hiện thay thế các trận đấu đầu tiên và tất cả các trận đấu tương ứng.

sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
    fixed = FALSE, useBytes = FALSE)

gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
     fixed = FALSE, useBytes = FALSE)


sub("4", "8", "An Introduction to R Software Course will be of 4 weeks duration" )  
##"An Introduction to R Software Course will be of 8 weeks duration"

gsub("4", "8", "An Introduction to R Software Course will be of 4 weeks duration" )
##"An Introduction to R Software Course will be of 8 weeks duration"
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.