在Ruby中交换字符串的一部分
在Ruby中,用另一个值交换字符串的一部分最简单的方法是什么。假设我有一封电子邮件,我想在两个域上检查它,但我不知道哪一个域可以作为输入。我正在构建的应用程序应该与@gmail.com和@googlemail.com域一起使用 例如:在Ruby中交换字符串的一部分,ruby,Ruby,在Ruby中,用另一个值交换字符串的一部分最简单的方法是什么。假设我有一封电子邮件,我想在两个域上检查它,但我不知道哪一个域可以作为输入。我正在构建的应用程序应该与@gmail.com和@googlemail.com域一起使用 例如: swap_string 'user@gmail.com' # >>user@googlemail.com swap_string 'user@googlemail.com' # >>user@gmail.com "user@gmail.c
swap_string 'user@gmail.com' # >>user@googlemail.com
swap_string 'user@googlemail.com' # >>user@gmail.com
"user@gmail.com".gsub(/@gmail/, '@googlemail')
假设googlemail.com和gmail.com是仅有的两种可能性,那么您可以使用以下方法将模式替换为给定的替换:
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"
如果您希望用其他内容替换字符串的一部分,那么gsub工作得非常好 它允许您将字符串的一部分与正则表达式匹配,然后用另一个字符串替换该部分。当然,您可以使用特定的字符串来代替正则表达式 例如:
swap_string 'user@gmail.com' # >>user@googlemail.com
swap_string 'user@googlemail.com' # >>user@gmail.com
"user@gmail.com".gsub(/@gmail/, '@googlemail')
等于
user@googlemail.com
在我的例子中,我使用了@gmail和@googlemail,而不仅仅是gmail和googlemail。这样做的原因是为了确保它不是一个名为gmail的帐户。这不太可能,但有可能发生
也不要与.com匹配,因为这可能会根据用户电子邮件的位置而变化。字符串在其袖子上有一个巧妙的技巧,形式如下:
允许向方法传递查找使其更易于重用,但您也可以很容易地将该哈希值放入方法本身。我的补充:
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
这是一段糟糕的代码,我想。您可以尝试使用Ruby gsub: 例如: 根据您在函数中传递字符串参数的需要,应执行以下操作:
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
破坏性行动?错误的选择。我可以看到注释涉及使用一个if语句和两个.sub调用。我认为这是很明显的,但我认为你可以用Ruby做得更聪明。聪明的代码很好。显然代码更好。对不起,我的内存快用完了。我更新了if s[find],以避免在字符串中找不到范围的情况下出现索引错误。在查找块中,您是不是用gmail.com替换了googlemail.com,然后再次用googlemail.com替换了gmail.com下一次查找?@limekin是的。我刚刚更新了包含和中断,以防找到查找/替换。为什么是gsub而不是sub?您的编辑有助于防止我的错误_gmail@gmail.com`,那么为什么不改变你的答案,将其纳入其中呢?在这种情况下,gsub或sub没有区别。就我个人而言,我倾向于使用gsub,因为它的行为与我期望的替代品一样。这只是习惯/个人偏好,两者都有效。我现在已将编辑合并到答案中。bugmail@gmail.com.gsubgmail,googlemail=>bugooglemail@googlemail. 关于gsub的讲座不合适。回答要简短,切中要害。