【问题标题】:Remove "@" sign and everything after it in Ruby在 Ruby 中删除“@”符号及其后面的所有内容
【发布时间】:2011-10-23 12:24:55
【问题描述】:

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

我已经进行了研究,但无法在 Ruby 中找到这样做的方法。有什么建议吗??

【问题讨论】:

标签: ruby regex email-validation


【解决方案1】:

您可以在“@”上拆分,只使用第一部分。

email.split("@")[0]

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

【讨论】:

    【解决方案2】:

    在@符号前捕捉任何东西

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

    【讨论】:

    • +1 表示正则表达式。为您提供更多功能并帮助您避免引用文字索引位置的危险习惯。
    • @Ishpeck:您需要多少多功能性?您在@ 符号处拆分字符串。这不是一项特别不稳定的任务,将整个 Regexp FSM 的复杂性添加到混合中似乎并没有减少它。
    • 您可以使用正则表达式来清理数据,例如数据库查询。 xkcd.com/327
    • @迪伦:谢谢!这正是我想要的。谢谢。
    • 我同意 #split 可能是这个特定场景的更简单的答案 - 但我不认为 RegExp 过于复杂
    【解决方案3】:

    只需在 @ 符号处拆分并抓住它之前的内容。

    string.split('@')[0]
    

    【讨论】:

      【解决方案4】:

      String#split 会很有用。给定一个字符串和一个参数,它返回一个数组,将字符串拆分为该字符串上的单独元素。所以如果你有:

      e = test@testing.com
      e.split("@")
       #=> ["test", "testing.com"]
      

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

      【讨论】:

        【解决方案5】:

        使用 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>]
        

        【讨论】:

        • 人们太容易使用正则表达式了。它们应该是分割字符串的首选。
        • 你可能想看看我添加的基准,注意最终答案而不是排练。假设正则表达式引擎已经启动,它会更快。
        • 我应该补充一点,除非它在循环中,否则没有理由优化这样的语句。网络延迟比您解析/验证参数的方式要大得多。我只是想说明这一点,因为你发表了一个笼统和说教的评论
        • 基准测试有点疯狂,只使用 100 次迭代是非常虚假的。无论如何,email[0,email.index('@')] 不仅将您的两个基准解决方案都从水中吹了出来,而且更重要的是显而易见且直截了当。通过正则表达式用空字符串替换非子字符串的内容来查找子字符串几乎是您可以获得的解决方案。正则表达式不适合这个,你在滥用它。
        • 另请注意,当域部分包含连字符或数字时,您的正则表达式会中断,这两者都是有效的。您可以将它们添加到模式中,但关键是您不必这样做。您开始尝试查找@ 之前的字符,突然您正在编写一个正则表达式来验证域名。当您尝试让正则表达式成为每个琐碎问题的答案时,就会发生这种情况。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 2022-06-16
        • 2012-07-14
        • 2015-01-27
        • 2018-06-26
        相关资源
        最近更新 更多