Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中交换字符串的一部分_Ruby - Fatal编程技术网

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

在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

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

例如:

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的讲座不合适。回答要简短,切中要害。