在Ruby中删除“@”符号及其后面的内容

28

我正在开发一个应用程序,在其中需要将用户电子邮件地址中“@”号前的任何内容作为他/她的名字和姓氏传递。例如,如果用户的电子邮件地址为“user@example.com”,那么当用户提交表单时,我会从电子邮件地址中移除“@example.com”,并将“user”分配为名字和姓氏。

我已经进行了研究,但无法找到在 Ruby 中实现此功能的方法。有什么建议吗?


你为什么要使用正则表达式来做这个?https://dev59.com/uHVC5IYBdhLWcg3wtzut - Andrew Grimm
5个回答

52

你可以使用 "@" 进行分割,然后只使用第一部分。

email.split("@")[0]

这将为您提供“@”之前的第一部分。


48

在 @ 符号之前捕获 任何内容

my_string = "user@example.com"
substring = my_string[/[^@]+/]
# => "user"

+1 给正则表达式。 正则表达式可以使您更加灵活,并帮助您避免引用字面索引位置的危险习惯。 - Ishpeck
8
@Ishpeck:你需要多大的灵活性?你正在以“@”符号为分界点来分割字符串。这不是一项特别复杂的任务,将整个正则表达式状态机的复杂性加入其中似乎并没有使其更简单。 - Chuck
你可以使用正则表达式来清理数据,例如用于数据库查询。http://xkcd.com/327/ - Ishpeck
1
我同意#split可能是这种特定情况下更简单的答案--但我认为RegExp并不过于复杂。 - Dylan Markow

13

只需在 @ 符号处进行分割,然后获取它之前的内容。

string.split('@')[0]

8
String#split方法会很有用。给定一个字符串和一个参数,它将返回一个数组,将字符串分割成该字符串上的单独元素。因此,如果您有以下内容:
e = test@testing.com
e.split("@")
 #=> ["test", "testing.com"]

因此,您将使用e.split("@")[0]作为地址的第一部分。

1
使用 gsub 和正则表达式。
first_name = email.gsub(/@[^\s]+/,"")



irb(main):011:0> Benchmark.bmbm do |x|
irb(main):012:1* email = "user@domain.type"
irb(main):013:1> x.report("split"){100.times{|n| first_name = email.split("@")[0]}}
irb(main):014:1> x.report("regex"){100.times{|n| first_name = email.gsub(/@[a-z.]+/,"")}}
irb(main):015:1> end
Rehearsal -----------------------------------------
split   0.000000   0.000000   0.000000 (  0.000000)
regex   0.000000   0.000000   0.000000 (  0.001000)
-------------------------------- total: 0.000000sec

            user     system      total        real
split   0.000000   0.000000   0.000000 (  0.001000)
regex   0.000000   0.000000   0.000000 (  0.000000)
=> [#<Benchmark::Tms:0x490b810 @label="", @stime=0.0, @real=0.00100016593933105, @utime=0.0, @cstime=0.0, @total=0.0, @cutime=0.0>, #<Benchmark::Tms:0x4910bb0 @
label="", @stime=0.0, @real=0.0, @utime=0.0, @cstime=0.0, @total=0.0, @cutime=0.0>]

人们往往太容易使用正则表达式,但它们不应成为分割字符串的首选。 - user229044
你可能想看一下我添加的基准测试,注意最终答案而不是排练。假设正则表达式引擎已经启动,它会更快。 - Tim Hoolihan
我应该补充一下,除非它在循环中,否则没有理由优化这样的语句。网络延迟比您解析/验证参数更重要。我只是想指出,因为您发表了一个概括性和说教式的评论。 - Tim Hoolihan
2
基准测试这种做法很疯狂,只使用100次迭代非常虚伪。尽管如此,email [0,email.index('@')]不仅能够轻松超越你所测试的两个解决方案,而且更加明显和直观。通过正则表达式将非子串替换为空字符串来查找子串是最麻烦的解决方案之一。正则表达式并不适用于此情况,你正在误用它。 - user229044
请注意,当域名部分包含连字符或数字时,您的正则表达式会出现错误,这两者都是有效的。您可以将它们添加到模式中,但重点是您不应该这样做。您最初尝试查找@之前的字符,突然间您正在编写一个用于验证域名的正则表达式。当您试图将正则表达式作为解决每个琐碎问题的答案时,就会发生这种情况。 - user229044
@TimHoolihan 让我们在聊天室继续这个讨论 - user229044

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接