Яка різниця між методами gsub та sub для Ruby Strings


111

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


Відповіді:


208

Поняття gглобального, як замість глобального (усі):

У irb:

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

13
Так. Я тепер розумію. На мою захист, я не думаю, що це було дуже очевидно ... Досі це так.
Ryanmt

15
Я згоден з вами, що це не очевидно! Java називає ці replaceта replaceAll. Але Ruby має коріння в Perl, який використовує gмодифікатор. Це просто одна з таких речей.
Рей Тол

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.