从JS中的字符串中提取姓名和电子邮件

Extract name and email from string in JS

如何从字符串中提取姓名和电子邮件,其中电子邮件以逗号分隔。

下面的 regex 适用于单个电子邮件,但不适用于字符串中的电子邮件。

(?:"?([^"]*)"?\s)?(?:<?(.+@[^>]+)>?)

注意名称中的逗号

johndoe@baidu.com, John <johndoe@google.com>, John D, A <johndoe@bing.com>, "John Doe , Yen" <johndoe@163.com>

输出:

Name: null
Email: johndoe@baidu.com

Name: John
Email: johndoe@google.com

Name: John D, A
Email: johndoe@bing.com

Name: John Doe , Yen
Email: johndoe@163.com

这是一个可能的答案:

(?:^|, *)(?![^",]+")(?:((?=[^"<]+@)|(?![^"<]+@)"?(?<name>[^"<]*)"? *))<?(?<email>[^,>]*)>?

这是使用 ruby 正则表达式,并使用正向匹配来确定条目是否有名称。

  1. (?:^|, *):从字符串的最前面开始,或者在一个,和多个空格之后
  2. (?![^",]+"):否定先行,如果有一些字符然后是",则中止匹配。这会阻止逗号在字符串中开始匹配。
  3. (?:((?=[^"<]+@)|(?![^"<]+@)"?(?<name>[^"<]*)"? *)): 匹配名字:

    1. (?=[^"<]+@) 如果@出现在引号或左大括号之前,它只是一个没有名字的电子邮件地址,所以不要匹配
    2. (?![^"<]+@)"?(?<name>[^"<]*)"? *):否则,匹配名称(如果存在则跳过开始和结束引号
  4. <?(?<email>[^,>]*)>?: 匹配邮箱。

On rubular

请注意,对于真正的工作,这将是一个糟糕的方法。正则表达式几乎无法理解,更不用说脆弱了。它也不完整,例如,如果您可以转义名称中的引号会怎样?

如果你真的需要它,我会为此编写一个专用的解析器。如果您只是想提取一些数据,那么正则表达式可能就足够了。

很难说数据会改变还是保持不变,但这是我的尝试:

var re  = /(?:"?([A-Z][^<"]+)"?\s*)?<?([^>\s,]+)/g;

while (m = re.exec(str)) {
  if(m[1]) { m[1] = m[1].trim() }
  console.log("Name: "  + m[1]);
  console.log("Email: " + m[2]);
}

Working Demo