Как использовать строковый метод gsub в Ruby? (String#gsub)

gsub - строковый метод в Ruby, который позволяет осуществлять поиск в строке и заменять все найденные результаты на новое заданное значение из переданного аргумента.

sentence = "I love cats"
sentence.gsub('cats','dogs')

=> "I love dogs"

Возвращает модифицированную копию строки. Проверим исходную переменную:
sentence

=> "I love cats" 

Метод gsub принимает два аргумента - что заменить и на что заменить.

sentence.gsub('поменяй меня','на этот текст')

Помимо этого, данный метод позволяет использовать регулярные выражения, что добавляет больше гибкости нашим действиям:

sentence = "Этот товар стоил 5 долларов"
sentence.gsub(/\d+/,"20")

=> "Этот товар стоил 20 долларов"

При помощи регулярного выражения \d+ мы нашли цифру и заменили ее на значение из второго аргумента.

Очень полезной является поддержка блоков. Рассмотрим пример изменения стоимости товара:

sentence = "Current price $10"

Применим 30% скидку на цену указанную в этой строке:

sentence.gsub(/\d+/) { |n| n.to_i - ((n.to_i * 30) / 100) }

=> "Current price $7" 

В качестве второго аргумента gsub может принять хеш, что очень полезно, когда нужно заменить несколько элементов на разные значения.

Рассмотрим пример, где нужно убрать из строки ненужные элементы, а именно "rgb(" и ")". В результате нужно получить только числовое значение RGB цвета:

color = "rgb(0, 0, 0)"
color.gsub(/[rgb()]/, 'rgb(' => '', ')' => '')

=> "0, 0, 0"

Обратите внимание, что в качестве нового значения намеренно передавалось пустое значение (этого мы и добивались).

Рассмотрим пример с не пустым значением:

color = "rgb(0, 0, 0)"
color.gsub(/[()]/, '(' => 'a(', ')' => ', 1)')

=> "rgba(0, 0, 0, 1)" 

Таким образом мы изменили нашу строку используя хеш в качестве второго аргумента метода gsub.

Использование данного метода с восклицательным знаком в конце (gsub!) изменяет значение исходной переменной.

color = "rgb(0, 0, 0)"
=> "rgb(0, 0, 0)"

color
=> "rgb(0, 0, 0)"

color.gsub!(/[()]/, '(' => 'a(', ')' => ', 1)')
=> "rgba(0, 0, 0, 1)"

color
=> "rgba(0, 0, 0, 1)"