Jaka jest różnica między metodami gsub i sub w Ruby Strings


Odpowiedzi:


208

gOznacza globalny, jak w wymieniać globalnie (wszystkie):

W irb:

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

13
Tak. Teraz rozumiem. Na moją obronę, nie sądzę, żeby było to zbyt oczywiste ... To znaczy do tej pory.
Ryanmt

15
Zgadzam się z tobą, że to nie jest oczywiste! Java nazywa je replacei replaceAll. Ale Ruby ma swoje korzenie w Perlu, który używa gmodyfikatora. To tylko jedna z tych rzeczy.
Ray Toal,

1
Na szczęście jest to teraz oczywiste. Dowiem się w przyszłości.
Ryanmt,

Nawiasem mówiąc, subjest znacznie szybszy niż gsub, jest tutaj benchmark github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu

Widzę różne zachowania: A, sentence, separated, by, commas".gsub!(/(.*),(.*)/,"\\2 \\1") => " commas A, sentence, separated, by" Jakieś myśli, dlaczego gsub!wydaje się, że znajdowanie / zastępowanie tylko pierwszego wystąpienia podczas korzystania z grup wyrażeń regularnych?
Bennett Talpers

31

Różnica polega na tym, że subzastępuje tylko pierwsze wystąpienie określonego wzorca, podczas gdy gsubrobi to dla wszystkich wystąpień (to znaczy zastępuje globalnie).


10
Gdybyś odpowiedział minutę wcześniej, być może 1020 więcej przedstawicieli byłoby Twoje. :)
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

subi gsubwykonaj zastąpienie odpowiednio pierwszego i wszystkich dopasowań.

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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.