【问题标题】:Extract name and email from string in JS从JS中的字符串中提取名称和电子邮件
【发布时间】:2015-04-09 20:59:36
【问题描述】:

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

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

【问题讨论】:

  • 您期望的输出是什么?
  • 也试了一下,see fiddle :)

标签: javascript regex email


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是一个可能的答案:

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

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

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

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

    On rubular

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

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

    【讨论】:

    • 感谢您的详细回答。
    猜你喜欢
    • 2023-03-31
    • 2017-10-10
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多