【问题标题】:How to sort .edu email domains? [closed]如何对 .edu 电子邮件域进行排序? [关闭]
【发布时间】:2014-01-07 11:21:34
【问题描述】:

我正在使用 Ruby on Rails 创建一个大学专用网站,该网站通过他们的“.edu”电子邮件将所有注册用户分类到他们的特定大学。几乎所有美国大学都有一个“xyz.edu”电子邮件域。从本质上讲,使用“.edu”电子邮件注册的每个人都将被归类为类似的“domain.edu”。

我已经搜索了一个正则表达式来查找 like-domains.edu 并将它们分配给一个变量或特定索引,但我一定是找错了地方,因为我找不到如何做到这一点。

我会为此使用正则表达式吗?或者他们的电子邮件经过验证后的方法?

如果能得到任何帮助或反馈,我将不胜感激。

【问题讨论】:

  • 您可以使用正则表达式匹配模式,而不是排序。当然,您可以使用 Ruby 根据您使用正则表达式进行的匹配对事物进行排序。
  • 你写了什么代码? “有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包括有效的代码来重现它。有关指导,请参阅 SSCCE.org。”

标签: ruby-on-rails ruby regex email email-validation


【解决方案1】:

您可以使用正则表达式来提取域名:

"gates@harvard.edu" =~ /.*@(.*)$/

这个简单的正则表达式将捕获@ 符号之后的所有内容。你可以experiment more with this regexp here。

但是,你需要考虑的是如何处理gates@harvard.edu 与gates@seas.harvard.edu 之类的情况。

我的示例会将它们解析为不同的实体:harvard.edu 与 seas.harvard.edu。

【讨论】:

  • 你可以先"gates@harvard.edu".scan(/.*@(?<domain>.*)$/) 然后domain.split('.')[-2]。它将为展位返回harvard:gates@harvard.edu 和gates@seas.harvard.edu。
  • @ŁukaszNiemier,您还可以在正则表达式中使用否定查找来仅解析 TLD。我给出了我的解决方案,因为不清楚 OP 需要什么。也许他想保留二级名称……
  • 我的解决方案保留二级名称。此外,它还保存了所有域部分。
  • scan 对此没有多大用处。它想要找到重复出现的模式并返回一个数组,从而迫使我们处理一个数组。
【解决方案2】:

我可能会继续创建一个可以容纳这些用户的机构/大学/团体模型。现在比以后更容易。但是,为了回答您的问题,您可以执行以下操作:

array_of_emails = ['d@xyz.edu', 'a@abc.edu', 'c@xyz.edu', 'b@abc.edu' ]
array_of_emails.sort_by! { |email| "#{email[email.index('@')..-1]}#{email[0..email.index('@')]}" }

编辑:改变了排序! to sort_by!

【讨论】:

  • sort_by 在这里更好。
【解决方案3】:
array_of_emails = ['d@xyz.edu', 'a@abc.edu', 'c@xyz.edu', 'b@abc.edu' ]
x = array_of_emails.sort_by do | a | a.match(/@.*/)[0] end
x.each do |a|
  puts a
end

【讨论】:

  • 等一下,你真的只是复制粘贴我的代码,然后放入 sort_by 而不是提出修改建议吗?
【解决方案4】:

随着新 TLD 的上线,处理域名在未来会变得更加复杂。假设 .edu 是唯一的教育 TLD 将是错误的。

目前只获取域的一种简单方法是:

"gates@harvard.edu"[/(@.+)$/, 1] # => "@harvard.edu"

这将处理以下事情:

"gates@mail.harvard.edu"[/(@.+)$/, 1] # => "@mail.harvard.edu"

如果您不想要@,只需将左括号右移一个字符:

pattern = /@(.+)$/
"gates@harvard.edu"[pattern, 1] # => "harvard.edu"
"gates@mail.harvard.edu"[pattern, 1] # => "mail.harvard.edu"

如果您想规范化域以剥离子域,您可以执行以下操作:

pattern = /(\w+\.\w+)$/
"harvard.edu"[pattern, 1] # => "harvard.edu"
"mail.harvard.edu"[pattern, 1] # => "harvard.edu"

它只抓取由单个. 分隔的最后两个“单词”。

这有点幼稚,因为非美国域可以有国家代码,所以如果您需要处理这些,您可以执行以下操作:

pattern = /(\w+\.edu(?:\.\w+)?)$/
"harvard.edu"[pattern, 1] # => "harvard.edu"
"harvard.edu.cc"[pattern, 1] # => "harvard.edu.cc"
"mail.harvard.edu.cc"[pattern, 1] # => "harvard.edu.cc"

还有,您是否应该在验证他们的地址之前或之后执行此操作? 之后再做。为什么要浪费你的 CPU 时间和磁盘空间来处理无效地址?

【讨论】:

    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多