В чем разница между методами gsub и sub для строк Ruby


111

Я просматривал документацию на Stringсегодня и увидел :subметод, которого никогда раньше не замечал. Я использую, :gsubи похоже, что они по сути одинаковы. Может ли кто-нибудь объяснить мне разницу? Спасибо!


Ответы:


208

Это gозначает global, как в replace global (all):

В irb:

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

13
Да. Теперь я понимаю. В свое оправдание я не думаю, что это было очень очевидно ... До сих пор.
Ryanmt

15
Я согласен с вами, что это не очевидно! Java называет их replaceи replaceAll. Но у Ruby есть корни в Perl, который использует gмодификатор. Это просто одна из тех вещей.
Ray Toal

1
К счастью, теперь это очевидно. Я узнаю в будущем.
Ryanmt

Кстати, subнамного быстрее, чем gsub, здесь есть тест github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu

Я вижу различное поведение по отношению к этому: A, sentence, separated, by, commas".gsub!(/(.*),(.*)/,"\\2 \\1") => " commas A, sentence, separated, by" какие-либо мысли, почему, gsub!кажется, находит / заменяет только первый экземпляр при использовании групп регулярных выражений?
Bennett Talpers

31

Разница в том, что subзаменяет только первое вхождение указанного шаблона, тогда gsubкак заменяет все вхождения (то есть заменяет глобально).


10
Если бы вы ответили на минуту раньше, возможно, у вас было бы еще 1020 повторений. :)
Эндрю Гримм

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

subи gsubпроизвести замену первого и всех совпадений соответственно.

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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.