如何使用 ruby 从 <mail to> 标签中提取电子邮件地址?

how can I use ruby to extract the email address from a <mail to> tag?

我的程序从 Slack 获取输入。提供电子邮件后,Slack 会自动将其转换为邮件以标记:

<mailto:timxxxx@gmail.com|timxxxx@gmail.com>

电子邮件地址相同。

如果电子邮件以这种形式提供,我想轻松提取它,但如果电子邮件来自另一个未重新格式化的渠道,请使用该电子邮件。

您没有指定其他格式,但您可以使用正则表达式来识别给定格式的字符串并验证 | 的两边确实是相同的地址。代码类似于:

def get_mail(str)
   matches = /<mailto:([\w\-\.]+@[\w\-\.]+)\|([\w\-\.]+@[\w\-\.]+)>/.match(str)

   if (matches.nil? || matches[0] != matches[1])
       str
   else
       matches[0]
   end
end

请注意,某些特殊情况的电子邮件地址可能无法匹配,因为有一些疯狂的电子邮件是有效的,但这适用于基本情况。如果需要,您可以修改正则表达式以使用更具包容性的电子邮件匹配。

我假设如果字符串看起来像:

<mailto:....>

圆点代表一个或多个电子邮件地址,如果超过一个,则用"|"分隔。此外,我假设不需要检查字符串的一部分来确认它包含正确分隔的有效电子邮件地址。在这些假设是正确的情况下,您不需要正则表达式来提取电子邮件地址:

def extract_addresses(str)
  return nil unless str.start_with?('<mailto:') and str.end_with?('>')
  str[8..-2].split('|')
end

addresses = extract_addresses "<mailto:timxxxx@gmail.com|timxxxx@gmail.com>"
  #=> ["timxxxx@gmail.com", "timxxxx@gmail.com"] 
puts addresses ? "mailto format" : "not mailto format"
mailto format
puts "addresses are the same" if addresses && addresses.uniq.size == 1
addresses are the same

addresses = extract_addresses "<the quick brown dog jumped over the lazy fox>"
  #=> nil