2015-06-05 2 views
0

Я написал метод, чтобы найти и заменить строку в большую строку следующим образом:Найти и заменить только соответствующий первый результат

def user_gsubbed_text 
    text.include?('##') 
    var = text.match(/##\w+/).to_s.tr('##', '') 
    text.gsub!(var, document.user.send(var.to_sym)).tr('##', '') 
    else 
    text 
    end 
end 

Так что если ##phone в строке будет заменен номер телефона пользователя. Он отлично работает в первом смысле, но, учитывая строку, как это:

"Call me on ##phone or email me at ##email." 

Он заменяет только номер телефона, а не адрес электронной почты. Что я делаю не так?

+0

Невозможно воспроизвести. – sawa

ответ

3

У вас нет какой-либо петли. Ваш код просто находит первый ##foo, затем извлекает имя переменной, а затем заменяет эту переменную глобально. Другие #bar s не касаются вообще.

Самый простой способ заключается в использовании блок-формы gsub!:

def user_gsubbed_text(text) 
    text.gsub!(/##(\w+)/) do |match| 
    document.user.send($1.to_sym) 
    end 
end 
+0

Если вы не удалите '| match |' или замените '$ 1' на' match'? –

+0

Невозможно заменить '$ 1'' match', у них есть другое содержимое ('$ 1'' 'email '', 'match' is' "## email" '). Я * мог * удалить '| match | '. – Amadan

+0

Спасибо. С моей стороны была небольшая путаница. –

2

Если я правильно понял вопрос правильно, вы могли бы использовать String#gsub с хэш:

h = { "##phone"=>"123-456-7899", "##email"=>"[email protected]" } 

str = "Call me on ##phone or email me at ##email." 

str.gsub(/\#\#\w+/, h) 
    #=> "Call me on 123-456-7899 or email me at [email protected]" 

или:

h.default_proc = proc { |h,k| k } 
str.gsub(/\S+/, h) 
    #=> "Call me on 123-456-7899 or email me at [email protected]" 

Последнее немного более гибкое, если вы хотите для добавления дополнительных пар ключ-значение в хэш.

+0

Хэш-подход не имеет смысла в моем случае, спасибо. –

Смежные вопросы