Ruby regex - хранит ли gsub то, что соответствует? - программирование
Подтвердить что ты не робот

Ruby regex - хранит ли gsub то, что соответствует?

Если я использую

.gsub(/matchthisregex/,"replace_with_this")

хранит ли gsub то, что он соответствует регулярному выражению? Я хотел бы использовать то, что он соответствует в моей заменяющей строке. Например, что-то вроде

"replace_with_" + matchedregexstring + "this"

в моем примере выше, где matchedregexstring будет сохраненным совпадением от gsub? Извините, если это сбивает с толку, я не знаю, как еще это сказать.

4b9b3361

Ответ 1

Из прекрасного руководства:

Если замена является String, она будет заменена согласованным текстом. Он может содержать обратные ссылки на группы захвата шаблонов формы \d, где d - номер группы или \k<n>, где n - имя группы. Если это строка с двумя кавычками, обе обратные ссылки должны предшествовать дополнительной обратной косой чертой. Однако при замене специальные переменные соответствия, такие как &$, не будут ссылаться на текущее совпадение.
[...]
В форме блока текущая строка соответствия передается как параметр, и переменные, такие как $1, $2, $`, $& и $' будут установлены соответствующим образом. Значение, возвращаемое блоком, будет заменено на совпадение при каждом вызове.

Если вам не нужны группы захвата (т.е. такие вещи, как (expr) в регулярном выражении), вы можете использовать форму блока и $&:

>> 'where is pancakes house?'.gsub(/is/) { "-#{$&}-" }
=> "where -is- pancakes house?"

Если у вас есть группы захвата, вы можете использовать \n в строке замены:

>> 'where is pancakes house?'.gsub(/(is)/, '-\1-')
=> "where -is- pancakes house?"

или $n в блоке:

>> 'where is pancakes house?'.gsub(/(is)/) { "-#{$1}-" }
=> "where -is- pancakes house?"

Ответ 2

Для всех рубиновых версий: простой способ получить соответствие строки.

.gsub(/matched_sym/) {|sym| "-#{sym}-"}

Ответ 3

Я обнаружил здесь, что gsub-совпадения могут быть доступны через переменную Regexp.last_match (класс MatchData) следующим образом:

my_string.gsub(my_regexp){ Regexp.last_match.inspect }

Чтобы дать более практичный пример, если вы хотите регистрировать все совпадения, его можно использовать следующим образом:

"Hello world".gsub(/(\w+)/) { Regexp.last_match.captures.each{ |match| Rails.logger.info "FOUND: #{match}"} }

#Rails log:
FOUND: Hello
FOUND: world

В вашем конкретном случае вы можете сделать что-то вроде этого:

mystring.gsub(/(matchthisregex)/){ mystring = "replace_with_#{Regexp.last_match[0].to_s}this"}