【问题标题】:regex extract email from strings正则表达式从字符串中提取电子邮件
【发布时间】:2017-07-13 11:08:31
【问题描述】:

我想知道通过使用正则表达式是否能够从以下字符串中提取电子邮件?

以下 RE 模式是 .*@.*match 与所有字符串。它在某些字符串上工作得很好,但不是全部。

我想匹配所有与电子邮件模式匹配的字符串,包括所有域,如 (some-url.com) 或 (some-url.co.id)

boleh di kirim ke email saya ekoprasetyo.crb@outlook.com tks...
boleh minta kirim ke db.maulana@gmail.com. 
dee.wien@yahoo.com. .
deninainggolan@yahoo.co.id Senior Quantity Surveyor
Fajar.rohita@hotmail.com, terimakasih bu Cindy Hartanto
firmansyah1404@gmail.com saya mau dong bu cindy
fransiscajw@gmail.com 
Hi Cindy ...pls share the Salary guide to donny_tri_wardono@yahoo.co.id thank a

【问题讨论】:

  • 您应该只查找一个好的电子邮件正则表达式,然后将其应用于您的文本,例如这里:emailregex.com
  • @TimBiegeleisen 是对的。这可能是正则表达式最常见的用法。有一些非常复杂或相当简单的模式。一个快速的谷歌会给你最快的答案。
  • 目前在此页面上共享的所有模式都非常简单化,并且会传递大量无效的电子邮件地址而使一些好的电子邮件地址失败。

标签: javascript regex


【解决方案1】:

您可以使用正则表达式 /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/ 创建一个函数来从长文本中提取电子邮件 ID

function extractEmails (text) {
  return text.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi);
}

运行中的脚本:运行以查看结果

var text = `boleh di kirim ke email saya ekoprasetyo.crb@outlook.com tks... boleh minta kirim ke db.maulana@gmail.com. dee.wien@yahoo.com. . 
deninainggolan@yahoo.co.id Senior Quantity Surveyor
Fajar.rohita@hotmail.com, terimakasih bu Cindy Hartanto
firmansyah1404@gmail.com saya mau dong bu cindy
fransiscajw@gmail.com 
Hi Cindy ...pls share the Salary guide to donny_tri_wardono@yahoo.co.id thank a`; 

function extractEmails ( text ){
    return text.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi);
    }
     
    $("#emails").text(extractEmails(text));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<p id="emails"></p>

虽然上面代码中的正则表达式 sn-p 匹配大多数电子邮件模式,但如果您仍然需要匹配 >99% 的电子邮件模式,包括边缘情况(如电子邮件中的“+”),那么使用如下所示的正则表达式模式

运行中的脚本:运行以查看结果

var text = `boleh di kirim ke email saya ekoprasetyo.crb@outlook.com tks... boleh minta kirim ke db.mau+lana@gmail.com. dee.wi+en@yahoo.com. . 
deninainggolan@yahoo.co.id Senior Quantity Surveyor
Fajar.rohita@hotmail.com, terimakasih bu Cindy Hartanto
firmansyah1404@gmail.com saya mau dong bu cindy
fransiscajw@gmail.com 
Hi Cindy ...pls share the Salary guide to donny_tri_wardono@yahoo.co.id thank a`; 

function extractEmails ( text ){
    return text.match(/(?:[a-z0-9+!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/gi);
    }
     
    $("#emails").text(extractEmails(text));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<p id="emails"></p>

【讨论】:

  • 好吧,实际上答案中的正则表达式也捕获了my_email@...com,为了避免这种情况,修改正则表达式如下:([a-zA-Z0-9._-]+@([a-zA-Z0-9_-]+\.)+[a-zA-Z0-9_-]+)
  • @ambrish,您能否扩展此代码以包括此案例:“dprice@msn.com;dprice@msn.com,'tmccarth@sbcglobal.net.'” 上述代码的问题是不是开头的 ' 也包含在'tmccarth@sbcglobal.net.' 电子邮件地址中,所以结果是这样的:"dprice@msn.com", "dprice@msn.com", "'tmccarth@sbcglobal.net"] 如何删除它以便我得到这种格式的结果"dprice@msn.com", "dprice@msn.com", "tmccarth@sbcglobal.net"]
  • @SS_flair 您可以通过任何可用的替换方法清理提取的电子邮件 ID
  • 只是为了学习:如果使用 i(不区分大小写)标志,为什么需要 A-Z 部分?
  • 请注意,此正则表达式似乎不接受 + 作为有效字符。请参阅 Sanjeev Siva 的回答进行微调:stackoverflow.com/a/54340560/1196465
【解决方案2】:

嗨,这个正则表达式不适合我......

       let items1 = document.querySelectorAll('h1');
                items1.forEach((item) => {
                    let pattern = (/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi)
                    if (item.innerHTML.match(pattern)) {
                        results.push({
                            emailId: item.innerHTML
                        });
                    }
                });

这是我从中获取文本的标签...只是一个例子。

 <h1>"dasd xyz@gmail.com asdas asdsad asdasd"</h1>

这是我得到的对象输出。

[
  { emailId: 'sadasdsa br@gmail.com' },
  { emailId: 'sadasd br2@gmail.com' },
  { emailId: '"asgdb@gmail.com"' },
  { emailId: '"dasd xyz@gmail.com asdas"' },
  { emailId: 'asgdb@gmail.com' }
]

【讨论】:

    【解决方案3】:

    我想补充一下@Ambrish Pathak 的回答,

    根据wikipedia,邮箱也可以接受+号

    ([a-zA-Z0-9+._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)
    

    会像魅力一样工作

    【讨论】:

    • 他们绝对可以。 gmail 甚至支持在您的邮件中添加:yourmail+something@gmail.com。当我必须创建多个用户(使用唯一的电子邮件)并在同一个帐户中接收所有邮件时,我一直使用它
    【解决方案4】:
    \b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}+\.[A-Z]{2,}
    

    【讨论】:

    • 一些 Google 电子邮件包含加号
    【解决方案5】:

    您可以使用以下正则表达式来捕获所有电子邮件地址。

    (?<name>[\w.]+)\@(?<domain>\w+\.\w+)(\.\w+)?
    

    demo / explanation

    此外,如果您愿意,您可以只捕获那些包含特定域名的电子邮件(即 some-url.com),并且您只需替换 \w+\.\w+ 部分即可在&lt;domain&gt; 之后加上您想要的域名。所以,就像(?&lt;name&gt;[\w.]+)\@(?&lt;domain&gt;outlook.com)(\.\w+)?

    demo / explanation

    【讨论】:

      【解决方案6】:

      希望这会奏效。

      [\w\.]+\@[\w]+(?:\.[\w]{3}|\.[\w]{2}\.[\w]{2})\b

      Regex Demo

      【讨论】:

      • 感谢您的分享,我更新了您的演示以捕获诸如“domaine.{2}”之类的电子邮件:) [\w\.]+\@[\w]+(?:\.[\w]{3}|\.[\w]{2}\.[\w]{2}|\.[\w]{2})\b
      【解决方案7】:

      [a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+ 为我工作,您可以在此regex101 saved regex 上查看结果。

      实际上只是用@ 符号分隔的相同模式的两倍。

      模式是 1 次或多次出现:

      • a-z: 任意小写字母
      • A-Z: 任意大写字母
      • 0-9: 任意数字
      • -_.:连字符、下划线或点

      如果它错过了一些电子邮件,添加任何丢失的字符,它应该可以解决问题。

      编辑

      我一开始没有注意到,但是当转到regex101 link 时,屏幕右上角有一个说明部分,解释了正则表达式匹配的内容。

      【讨论】:

      • 虽然最复杂的正则表达式对于大多数电子邮件验证情况来说不是必需的,但是这个过于简单化了。例如,它匹配user@..@_
      • 我能说什么,它匹配 OP 提供的示例中的所有电子邮件地址。如果他们提供更完整的样本,我很乐意根据需要进行调整。
      • 我可以理解这一点,但问题是当它匹配测试时,人们只是期望它匹配所有内容。错误在于 OP 没有进行简单的 google 搜索,这可能会从该站点返回热门结果。
      • 您好,感谢分享!我已经更新了您的演示以定义电子邮件只能以字母结尾:) [a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+[a-zA-Z]
      • + 符号在@ 之前的电子邮件地址中有效。这不包括那个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 2011-09-10
      • 2011-07-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2011-12-15
      相关资源
      最近更新 更多