2013-04-05 1 views
16

Если я используюRuby regex- does gsub хранит то, что соответствует?

.gsub(/matchthisregex/,"replace_with_this") 

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

"replace_with_" + matchedregexstring + "this" 

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

ответ

29

От fine manual:

Если замена является 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?" 
+0

Aha! - поэтому дополнительный '' ', который появляется в документах, является просто артефактами из Rdoc. Я почесывал голову, пытаясь понять, что они имели в виду. – matt

+0

@matt: Вы имеете в виду дополнительные обратные косые черты, верно? # * & # $ Markdown, см. Мою переменную $ -backtick для большего удовольствия: Да, вам нужно сказать '\\ 1', если вы используете двойные кавычки, но' \ 1' подходит, если вы используете одинарные кавычки (которые Я всегда делаю, если мне не нужна интерполяция). –

+2

Да, '' '' '' 'не' '. Я не заметил. Я думаю, что комментарии иногда могли бы делать с предварительным просмотром. – matt

1

я узнал here, что матчи 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"} 
3

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

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