Ruby中将一部分字符串与另一个值交换的最简单方法是什么?假设我有一封电子邮件,我想在两个域中检查它,但我不知道哪一个可以作为输入。我正在构建的应用程序应与@ gmail.com和@ googlemail.com域一起使用。在Ruby中交换字符串的一部分
例子:
swap_string '[email protected]' # >>[email protected]
swap_string '[email protected]' # >>[email protected]
Ruby中将一部分字符串与另一个值交换的最简单方法是什么?假设我有一封电子邮件,我想在两个域中检查它,但我不知道哪一个可以作为输入。我正在构建的应用程序应与@ gmail.com和@ googlemail.com域一起使用。在Ruby中交换字符串的一部分
例子:
swap_string '[email protected]' # >>[email protected]
swap_string '[email protected]' # >>[email protected]
假设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]"
如果你正在寻找替代多个部分字符串与其他东西,gsub工作得很好。
它可以让你搭配正则表达式的字符串的一部分,然后用另一个字符串替换只是一部分。自然,代替正则表达式,你可以使用一个特定的字符串。
实施例:
"[email protected]".gsub(/@gmail/, '@googlemail')
等于
[email protected]
在我的例子我用@gmail和@googlemail而不是仅仅Gmail和Googlemail电子邮件。这是为了确保它不是名称中的gmail帐户。这不太可能,但可能发生。
与.com不匹配,因为这可以根据用户的电子邮件地址进行更改。
为什么gsub而不是'sub'?你的“编辑”是有道理的(为了防止“my_gmail @ gmail.com”),那么为什么不改变你的答案来纳入呢? –
'gsub'或'sub'在这种情况下没有区别。就我个人而言,我倾向于接触'gsub',因为它表现得像我期望的替代品一样。这只是习惯/个人喜好,要么是有效的。我现在已将编辑纳入答案。 – Azarantara
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
要传递给你的方法使得它更可重复使用的,但你可以很容易地有方法的内部散列本身。
你测试了吗?不适合我。 –
对不起,我正在记忆中。如果字符串中的范围未找到,我会更新以包含'if s [find]'以避免出现'IndexError'。 –
在查找块中,是不是用'gmail.com'替换'googlemail.com',然后用'googlemail.com'替换'gmail.com'(next lookup)? – limekin
我另外:
def swap_domain str
str[/[email protected]/] + [ 'gmail.com', 'googlemail.com' ].detect do |d|
d != str.split('@')[1]
end
end
swap_domain '[email protected]'
#=> [email protected]
swap_domain '[email protected]'
#=> [email protected]
这是糟糕的代码,海事组织。
您可以使用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]
'“[email protected]”.gsub(“gmail”,“googlemail”)#=>“bugooglemail @ googlemail”'。 'gsub'的讲座不合适。保持你的答案简短和太重点。 –
@CarySwoveland更新。 – 2015-07-06 04:02:28
我可以看到,评论涉及使用一个if语句和两个.sub调用。我认为这很明显,但我认为你可以用Ruby更聪明地做到这一点。 – Sebastian
智能代码很好。明显的代码更好。 –