2015-07-03 12 views
0

Ruby中将一部分字符串与另一个值交换的最简单方法是什么?假设我有一封电子邮件,我想在两个域中检查它,但我不知道哪一个可以作为输入。我正在构建的应用程序应与@ gmail.com和@ googlemail.com域一起使用。在Ruby中交换字符串的一部分

例子:

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

我可以看到,评论涉及使用一个if语句和两个.sub调用。我认为这很明显,但我认为你可以用Ruby更聪明地做到这一点。 – Sebastian

+4

智能代码很好。明显的代码更好。 –

回答

1

假设googlemail.comgmail.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'?你的“编辑”是有道理的(为了防止“my_gmail @ gmail.com”),那么为什么不改变你的答案来纳入呢? –

+0

'gsub'或'sub'在这种情况下没有区别。就我个人而言,我倾向于接触'gsub',因为它表现得像我期望的替代品一样。这只是习惯/个人喜好,要么是有效的。我现在已将编辑纳入答案。 – 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

在查找块中,是不是用'gmail.com'替换'googlemail.com',然后用'googlemail.com'替换'gmail.com'(next lookup)? – limekin

1

您可以使用Ruby 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更新。 – 2015-07-06 04:02:28