【问题标题】:Extract email and name with regex使用正则表达式提取电子邮件和姓名
【发布时间】:2021-03-27 03:13:51
【问题描述】:

从这些字符串中提取姓名和电子邮件的正则表达式是什么?

johndoe@example.com
John <johndoe@example.com>
John Doe <johndoe@example.com>
"John Doe" <johndoe@example.com>

可以假设电子邮件是有效的。该名称将通过电子邮件由一个空格分隔,并且可能会被引用。

预期结果是:

johndoe@example.com
Name: nil
Email: johndoe@example.com

John <johndoe@example.com>
Name: John
Email: johndoe@example.com

John Doe <johndoe@example.com>
Name: John Doe
Email: johndoe@example.com

"John Doe" <johndoe@example.com>
Name: John Doe
Email: johndoe@example.com

这是我目前的进步:

(("?(.*)"?)\s)?(<?(.*@.*)>?)

(可以在这里测试:http://regexr.com/?337i5

【问题讨论】:

  • 您有哪些有效电子邮件的可能性?请注意,用于验证所有电子邮件的正则表达式可能很大。您需要澄清您认为所有电子邮件是正确的。
  • 我不需要验证电子邮件。
  • 您使用的是哪种语言或工具?
  • @RohitJain 在不同的浏览器中为我工作。无论如何,我添加了我目前最好的正则表达式。
  • @hpique 正则表达式与语言无关

标签: regex language-agnostic


【解决方案1】:

以下正则表达式似乎适用于所有输入,并且仅使用两个捕获组:

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

http://regex101.com/r/dR8hL3

感谢@RohitJain 和@burning_LEGION 分别介绍了非捕获组和角色排除的概念。

【讨论】:

    【解决方案2】:

    使用这个正则表达式"?([^"]*)"?\s*([^\s]+@.+)

    组 1 包含名称

    第 2 组包含电子邮件

    【讨论】:

      【解决方案3】:
      (([^<>()\[\]\\.,;:\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,}))
      

      https://regex101.com/r/pVV5TI/1

      【讨论】:

        【解决方案4】:

        您可以试试这个(与您的代码相同但改进了),但您需要在匹配后检查返回的组,因为电子邮件是在第 2 组或第 3 组中返回的,具体取决于是否给出了名称。

        (?:("?(?:.*)"?)\s)?<(.*@.*)>|(.*@.*)
        

        【讨论】:

        • 有没有办法保持在同一个捕获组中?
        • @hpique:取决于您的语言和正则表达式风格。如果支持,可以使用(?|...) 构造来完成,否则可能使&lt;&gt; 可选。如果需要验证,可以使用条件语句或任何其他巧妙的构造来完成 :-)。
        【解决方案5】:

        这样你可以得到有或没有名字,去掉引号。

        \"*?(([\p{L}0-9-_ ]+)\"?)*?\b\ *<?([a-z0-9-_\.]+@[a-z0-9-_\.]+\.[a-z]+)>?
        

        【讨论】:

          【解决方案6】:

          尽管@hpique 有一个很好的答案,但该解决方案仅在名称/电子邮件字符串是正则表达式中唯一被分析的内容时才有效。当您有包含其他项目(例如电子邮件)的较长消息时,它将不起作用。当此人包含中间名(即 James Herbert Bond

          这是我编写的一个更强大的正则表达式解决方案,即使字符串中还有许多其他内容,它也可以提取你想要的名字、姓氏和电子邮件:

          /(?:"?)(\b[A-Z][a-z]+\b ?)(\b[A-Z][a-z]+\b ?)*(?:"?) ?<([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)>|([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/g
          

          在此处查看上述语法:Example on Regexr

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-08-09
            • 1970-01-01
            • 2011-01-16
            • 2018-12-04
            • 1970-01-01
            • 2010-12-20
            • 2017-09-25
            • 2021-11-24
            相关资源
            最近更新 更多