使用正则表达式从 csv 中提取电子邮件

Email extraction from csv using regex

我有以下正则表达式:

/(.+?)((?:(?:[^<>()\[\]\.,;:\s@"]+(?:\.[^<>()\[\]\.,;:\s@"]+)*)|(?:".+"))@(?:(?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,})))/gi

用于从以下不同格式中提取电子邮件地址和姓名并避免重复,

  1. "FName LName" <fname.lname@gmail.com>, "Eg Name" <egname@gmail.com>, Closed Call<close_call@gmail.co.um>
  2. toys@urs.com
  3. serima<serima@google.com>
  4. One <one@one.com>;Two <two@two.com>; "New <new@new.com>"

有几个问题:

以下任何方式提取上述内容,更多elegant/efficient方式

  1. [{'name':'FName LName', 'email':'fname.lname@gmail.com'}, {'name':'Eg Name', 'email':'egname@gmail.com'}, {'name':'Closed Call', 'email':'close_call@gmail.co.um'}]
  2. [{'name':'', 'email':'toys@urs.com'}]
  3. [{'name':'serima', 'email':'serima@google.com'}]
  4. [{'name':'One', 'email':'one@one.com'}, {'name':'Two', 'email':'two@two.com'}, {'name':'New', 'email':'new@new.com'}]

注意:名字may/maynot要用双引号括起来,名字和[=17=之间不能有may/mayspace ]

问题#1 通过让第一个捕获组更贪婪一点解决了,

/(.*?)((?:(?:[^<>()\[\]\.,;:\s@"]+(?:\.[^<>()\[\]\.,;:\s@"]+)*)|(?:".+"))@(?:(?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(?:(?:[a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,})))/gi

问题 #2 留到今晚做梦时用 ;-)