2015-07-03 4 views
0

Самый простой способ в Ruby изменить часть строки с другим значением. Предположим, что у меня есть электронное письмо, и я хочу проверить его на двух доменах, но я не знаю, какой из них я получу в качестве ввода. Приложение, которое я создаю, должно работать с доменами @ gmail.com и @ googlemail.com.Swap часть строки в Ruby

Пример:

swap_string '[email protected]' # >>[email protected] 
swap_string '[email protected]' # >>[email protected] 
+0

я могу видеть, что комментарии включают использование оператора if и двух вызовов .sub. Я думаю, это довольно очевидно, но я предположил, что вы можете сделать это умнее с Ruby. – Sebastian

+4

Умный код хороший. Очевидный код лучше. –

ответ

1

Предполагая googlemail.com и gmail.com являются только две возможности, вы можете использовать sub заменить шаблон с данной замены:

def swap_string(str) 
    if str =~ /gmail.com$/ 
    str.sub("gmail.com","googlemail.com") 
    else 
    str.sub("googlemail.com","gmail.com") 
    end 
end 

swap_string '[email protected]' 
# => "[email protected]" 

swap_string '[email protected]' 
# => "[email protected]" 
+0

деструктивные операции? Плохой выбор. –

+0

@SergioTulentsev обновлен :) – shivam

+0

Теперь это лучше :) –

5

Если вы хотите, чтобы подменить часть строки с чем-то еще, gsub работает достаточно хорошо.

Link to Gsub docs

Это позволяет соответствовать часть строки с регулярным выражением, а затем заменить только ту часть с другой строкой. Естественно, вместо регулярного выражения вы можете просто использовать определенную строку.

Пример:

"[email protected]".gsub(/@gmail/, '@googlemail') 

равна

[email protected] 

В моем примере я использовал @gmail и @googlemail вместо того, чтобы просто Gmail и GoogleMail. Причина этого заключается в том, чтобы убедиться, что это не учетная запись с gmail в имени. Это маловероятно, но может случиться.

Не совместим с .com, так как это может измениться в зависимости от того, где находится адрес электронной почты пользователя.

+0

Почему 'gsub', а не' sub'? Ваш «EDIT» имеет смысл (для защиты от «my_gmail @ gmail.com»), так почему бы просто не изменить свой ответ, чтобы включить это? –

+0

'gsub' или' sub' не имеет значения в этом случае. Лично я склоняюсь к 'gsub', так как это ведет себя так, как я ожидал бы замены. Это просто привычка/личные предпочтения, либо работает. Теперь я включил EDIT в ответ. – Azarantara

0

String имеет аккуратный трюк это рукав в виде String#[]:

def swap_string(string, lookups = {}) 
    string.tap do |s| 
    lookups.each { |find, replace| s[find] = replace and break if s[find] } 
    end 
end 

# Example Usage 

lookups = {"googlemail.com"=>"gmail.com", "gmail.com"=>"googlemail.com"} 

swap_string("[email protected]", lookups) # => [email protected] 
swap_string("[email protected]", lookups) # => [email protected] 

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

+0

Вы проверили это? Не работает для меня. –

+0

Извините, я ушел из памяти. Я обновил, чтобы включить 'if s [find]', чтобы избежать «IndexError» в том случае, если диапазон в строке не найден. –

+1

В блоке поиска вы не заменяете 'googlemail.com'' gmail.com', а затем снова заменяете 'gmail.com' (следующий поиск) на' googlemail.com'? – limekin

1

Вы можете попробовать с Руби GSUB:

например:

"[email protected]".gsub("gmail.com","googlemail.com"); 

В соответствии с вашими потребностями прохождения параметра строки в функции этого нужно сделать:

def swap_mails(str) 

if str =~ /gmail.com$/ 

    str.sub('gmail.com','googlemail.com'); 

else 

    str.sub('googlemail.com','gmail.com'); 

end 

end 


swap_mails "[email protected]" //[email protected] 

swap_mails "[email protected]" ////[email protected] 
+0

'' [email protected] ".gsub (" gmail "," googlemail ") # =>" bugooglemail @ googlemail "'. Лекция на 'gsub' не соответствует действительности. Держите свои ответы короткими и слишком точными. –

+0

@CarySwoveland обновлен. –

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