正则表达式从字符串中提取电子邮件

IT技术 javascript regex
2021-02-19 09:21:06

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

以下 RE 模式.*@.*与所有字符串匹配。它对一些字符串工作正常,但不是全部。

我想匹配所有与电子邮件模式匹配的字符串,包括所有域,如 (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
6个回答

您可以使用正则表达式创建一个函数/([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>

虽然上面代码片段中的正则表达式匹配大多数电子邮件模式,但如果您仍然需要匹配超过 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>

@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"]
2021-04-30 09:21:06
好吧,其实答案中的regex也捕获了,my_email@...com为了避免这种情况,修改regexp如下:([a-zA-Z0-9._-]+@([a-zA-Z0-9_-]+\.)+[a-zA-Z0-9_-]+)
2021-05-01 09:21:06
请注意,此正则表达式似乎不接受+为有效字符。请参阅 Sanjeev Siva 的回答以稍作调整:stackoverflow.com/a/54340560/1196465
2021-05-04 09:21:06
@SS_flair 您可以通过任何可用的替换方法清理提取的电子邮件 ID
2021-05-05 09:21:06
只是为了学习:如果使用 i(不区分大小写)标志,为什么还需要 AZ 部分?
2021-05-09 09:21:06

我想补充@Ambrish Pathak 的回答,

根据维基百科,电子邮件地址也可以接受 + 符号

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

会像魅力一样工作

他们绝对可以。gmail 甚至支持在您的邮件中添加:yourmail+something@gmail.com。当我必须创建多个用户(使用唯一的电子邮件)并在同一帐户中接收所有邮件时,我一直使用它
2021-05-11 09:21:06

[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+为我工作,您可以在这个regex101 保存的 regex上检查结果

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

该模式是 1 次或多次出现:

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

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

编辑

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

+标志在 之前的电子邮件地址中有效@这不包括那个。
2021-04-21 09:21:06
我可以理解,但问题是当它匹配测试时,人们只是希望它匹配所有内容。错误在于 OP 没有进行简单的谷歌搜索,这可能会从该站点返回流行的结果。
2021-04-28 09:21:06
我能说什么,它匹配 OP 提供的示例中的所有电子邮件地址。如果他们提供更完整的样本,我很乐意在需要时进行调整。
2021-05-05 09:21:06
虽然对于大多数电子邮件验证情况来说,最复杂的正则表达式不是必需的,但这个过于简单是错误的。例如,它匹配user@..@_
2021-05-07 09:21:06
您好,感谢分享!我已经更新了您的演示,以定义电子邮件只能以字母结尾:)[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+[a-zA-Z]
2021-05-07 09:21:06

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

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

演示/解释

此外,如果您愿意,您可以仅捕获包含特定域名(即 some-url.com)的电子邮件,为此您只需将\w+\.\w+后面部分替换为<domain>您想要的域名。所以,它会像(?<name>[\w.]+)\@(?<domain>outlook.com)(\.\w+)?

演示/解释

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}+\.[A-Z]{2,}
一些 Google 电子邮件包含加号
2021-05-20 09:21:06