Как я могу заменить каждый экземпляр шаблона в рубине?
string.sub
похоже, что он заменяет только первый экземпляр. Есть ли опция для того или другого метода, который может заменить все шаблоны? Можете ли вы сделать это внутри регулярного выражения, например perl?
(Я думаю, что-то вроде r/blah/blah/)
... и +1 всем, кто может сказать мне, ПОЧЕМУ НА ЗЕМЛЕЕ string.sub
заменить только ПЕРВЫЙ матч?
Ответы
Ответ 1
String.gsub должен сделать трюк.
Цитирование документов:
gsub(pattern, replacement) → new_str
Возвращает копию str с все вхождения шаблона заменил второй аргумент. Образец, как правило, представляет собой Regexp; если задано как String, любое регулярное выражение метасимволов оно будет интерпретироваться буквально, например. \\d
будет соответствовать за которым следует d
вместо цифры.
Ответ 2
Я мог бы объяснить, почему sub
просто заменяет первое совпадение шаблона, но я думаю, что документация делает это намного лучше (от ri String#sub
в командной строке):
str.sub(pattern, replacement) => new_str
str.sub(pattern) {|match| block } => new_str
Returns a copy of _str_ with the _first_ occurrence of _pattern_
replaced with either _replacement_ or the value of the block.