在Ruby中交换字符串的一部分

时间:2015-07-03 12:41:51

标签: ruby

Ruby中最简单的方法是将字符串的一部分与另一个值互换。让我们说我有一封电子邮件,我想在两个域上查看,但我不知道哪一个我会得到一个输入。我建立的应用应与@ gmail.com和@ googlemail.com域合作。

示例:

swap_string 'user@gmail.com' # >>user@googlemail.com
swap_string 'user@googlemail.com' # >>user@gmail.com

5 个答案:

答案 0 :(得分:5)

如果您正在寻找用其他东西替换字符串的一部分,gsub可以很好地工作。

Link to Gsub docs

它允许您将字符串的一部分与正则表达式匹配,然后用另一个字符串替换该部分。当然,代替正则表达式,您只需使用特定的字符串。

示例:

"user@gmail.com".gsub(/@gmail/, '@googlemail')

等于

user@googlemail.com

在我的示例中,我使用了@gmail和@googlemail,而不仅仅是gmail和googlemail。这样做的原因是为了确保它不是名称中包含gmail的帐户。这不太可能,但可能会发生。

不要与.com匹配,因为这可能会根据用户的电子邮件地址而改变。

答案 1 :(得分: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 'user@gmail.com'
# => "user@googlemail.com"

swap_string 'user@googlemail.com'
# => "user@gmail.com"

答案 2 :(得分:1)

您可以尝试使用Ruby gsub:

例如:

  "user@gmail.com".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 "vgmail@gmail.com" //vgmail@googlemail.com

swap_mails "vgmail@googlemail.com" ////vgmail@gmail.com

答案 3 :(得分:0)

StringString#[]的形式有一个巧妙的伎俩:

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("user@gmail.com", lookups) # => user@googlemail.com
swap_string("user@googlemail.com", lookups) # => user@gmail.com

允许lookups传递给您的方法使其更具可重用性,但您可以轻松地在方法本身内部使用该哈希。

答案 4 :(得分:0)

我的补充:

def swap_domain str
  str[/.+@/] + [ 'gmail.com', 'googlemail.com' ].detect do |d|
    d != str.split('@')[1]
  end
end

swap_domain 'user@gmail.com' 
#=> user@googlemail.com
swap_domain 'user@googlemail.com' 
#=> user@gmail.com

这是糟糕的代码,imo。