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

时间:2015-02-09 23:16:10

标签: javascript regex email

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

下面的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

2 个答案:

答案 0 :(得分:3)

很难判断数据是否会改变或保持不变,但这是我的尝试:

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

答案 1 :(得分:0)

这是一个可能的答案:

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

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

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

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

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

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