用于电子邮件匹配的正则表达式

Regex for email matching

本文关键字:正则表达式 电子邮件 用于      更新时间:2023-09-26

我正在使用这个正则表达式来匹配字符串中的电子邮件地址。

这里一切正常:http://regexr.com?31e5a使用此正则表达式:

(['w-'.]+)@((?:['w]+'.)+)([a-zA-Z]{2,4})

但是当我尝试在javascript中使用它时,我只得到第一个电子邮件地址,而不是全部。

这是我的代码:

var emailsString = 'aaaaaaa@bbbb.com xxxxxxx cccccc@dddd.com';
var emails = emailsString.match(/(['w-'.]+)@((?:['w]+'.)+)([a-zA-Z]{2,4})/)[0];

广告在这里,我只收到第一封电子邮件。

如果你能帮我,谢谢你。

您需要添加一个"g"修饰符:

var emailsString = 'aaaaaaa@bbbb.com xxxxxxx cccccc@dddd.com';## Heading ##
var emails = emailsString.match(/(['w-'.]+)@((?:['w]+'.)+)([a-zA-Z]{2,4})/g)

此外,正如本文其他地方提到的,您的正则表达式与所有有效电子邮件不匹配。将有效电子邮件与正则表达式匹配实际上是一个非常困难的问题,但首先,TLD 组件可能超过 4 个字符,因此您应该相应地进行调整。

我的建议是将这里提到的其他正则表达式与/g 修饰符结合使用来获取所有匹配项。

g 修饰符用于执行全局匹配(查找所有匹配项) 而不是在第一场比赛后停止)。

以下是根据 RFC 2822 的电子邮件的正确正则表达式(根据此来源):

(?:[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])+)'])

除此之外,删除[0]并添加/g修饰符,您将获得数组中的完整列表。

如果要将所有数组作为单个字符串获取,请使用以下命令:

var str = arr.join(','); // or whatever delimiter you want to join with
// For example:
['aaa@aaa.com', 'bbb@bbb.net'].join(',') === 'aaa@aaa.com,bbb@bbb.net';

另外,作为旁注,在一个著名的Perl模块中,这里是用于真正验证"发件人"和"收件人"字段中的电子邮件地址的正则表达式(你不感兴趣,但我宁愿在这里有参考,所以我正在复制粘贴):

(?:(?:'r'n)?[ 't])*(?:(?:(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't]
)+|'Z|(?=['["()<>@,;:''".'[']]))|"(?:[^'"'r'']|''.|(?:(?:'r'n)?[ 't]))*"(?:(?:
'r'n)?[ 't])*)(?:'.(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(
?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|"(?:[^'"'r'']|''.|(?:(?:'r'n)?[ 
't]))*"(?:(?:'r'n)?[ 't])*))*@(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'0
31]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'
](?:(?:'r'n)?[ 't])*)(?:'.(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+
(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:
(?:'r'n)?[ 't])*))*|(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z
|(?=['["()<>@,;:''".'[']]))|"(?:[^'"'r'']|''.|(?:(?:'r'n)?[ 't]))*"(?:(?:'r'n)
?[ 't])*)*'<(?:(?:'r'n)?[ 't])*(?:@(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'
r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[
 't])*)(?:'.(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)
?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't]
)*))*(?:,@(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[
 't])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*
)(?:'.(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't]
)+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*))*)
*:(?:(?:'r'n)?[ 't])*)?(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+
|'Z|(?=['["()<>@,;:''".'[']]))|"(?:[^'"'r'']|''.|(?:(?:'r'n)?[ 't]))*"(?:(?:'r
'n)?[ 't])*)(?:'.(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:
'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|"(?:[^'"'r'']|''.|(?:(?:'r'n)?[ 't
]))*"(?:(?:'r'n)?[ 't])*))*@(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031
]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](
?:(?:'r'n)?[ 't])*)(?:'.(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?
:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?
:'r'n)?[ 't])*))*'>(?:(?:'r'n)?[ 't])*)|(?:[^()<>@,;:''".'['] '000-'031]+(?:(?
:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|"(?:[^'"'r'']|''.|(?:(?:'r'n)?
[ 't]))*"(?:(?:'r'n)?[ 't])*)*:(?:(?:'r'n)?[ 't])*(?:(?:(?:[^()<>@,;:''".'['] 
'000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|"(?:[^'"'r'']|
''.|(?:(?:'r'n)?[ 't]))*"(?:(?:'r'n)?[ 't])*)(?:'.(?:(?:'r'n)?[ 't])*(?:[^()<>
@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|"
(?:[^'"'r'']|''.|(?:(?:'r'n)?[ 't]))*"(?:(?:'r'n)?[ 't])*))*@(?:(?:'r'n)?[ 't]
)*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''
".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*)(?:'.(?:(?:'r'n)?[ 't])*(?
:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[
']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*))*|(?:[^()<>@,;:''".'['] '000-
'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|"(?:[^'"'r'']|''.|(
?:(?:'r'n)?[ 't]))*"(?:(?:'r'n)?[ 't])*)*'<(?:(?:'r'n)?[ 't])*(?:@(?:[^()<>@,;
:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([
^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*)(?:'.(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''"
.'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'['
]'r'']|''.)*'](?:(?:'r'n)?[ 't])*))*(?:,@(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'
['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'
r'']|''.)*'](?:(?:'r'n)?[ 't])*)(?:'.(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] 
'000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']
|''.)*'](?:(?:'r'n)?[ 't])*))*)*:(?:(?:'r'n)?[ 't])*)?(?:[^()<>@,;:''".'['] '0
00-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|"(?:[^'"'r'']|''
.|(?:(?:'r'n)?[ 't]))*"(?:(?:'r'n)?[ 't])*)(?:'.(?:(?:'r'n)?[ 't])*(?:[^()<>@,
;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']]))|"(?
:[^'"'r'']|''.|(?:(?:'r'n)?[ 't]))*"(?:(?:'r'n)?[ 't])*))*@(?:(?:'r'n)?[ 't])*
(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".
'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*)(?:'.(?:(?:'r'n)?[ 't])*(?:[
^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'[']
]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*))*'>(?:(?:'r'n)?[ 't])*)(?:,'s*(
?:(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''
".'[']]))|"(?:[^'"'r'']|''.|(?:(?:'r'n)?[ 't]))*"(?:(?:'r'n)?[ 't])*)(?:'.(?:(
?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=[
'["()<>@,;:''".'[']]))|"(?:[^'"'r'']|''.|(?:(?:'r'n)?[ 't]))*"(?:(?:'r'n)?[ 't
])*))*@(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't
])+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*)(?
:'.(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|
'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*))*|(?:
[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".'['
]]))|"(?:[^'"'r'']|''.|(?:(?:'r'n)?[ 't]))*"(?:(?:'r'n)?[ 't])*)*'<(?:(?:'r'n)
?[ 't])*(?:@(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["
()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*)(?:'.(?:(?:'r'n)
?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>
@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*))*(?:,@(?:(?:'r'n)?[
 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,
;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*)(?:'.(?:(?:'r'n)?[ 't]
)*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''
".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*))*)*:(?:(?:'r'n)?[ 't])*)?
(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['["()<>@,;:''".
'[']]))|"(?:[^'"'r'']|''.|(?:(?:'r'n)?[ 't]))*"(?:(?:'r'n)?[ 't])*)(?:'.(?:(?:
'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z|(?=['[
"()<>@,;:''".'[']]))|"(?:[^'"'r'']|''.|(?:(?:'r'n)?[ 't]))*"(?:(?:'r'n)?[ 't])
*))*@(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])
+|'Z|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*)(?:'
.(?:(?:'r'n)?[ 't])*(?:[^()<>@,;:''".'['] '000-'031]+(?:(?:(?:'r'n)?[ 't])+|'Z
|(?=['["()<>@,;:''".'[']]))|'[([^'[']'r'']|''.)*'](?:(?:'r'n)?[ 't])*))*'>(?:(
?:'r'n)?[ 't])*))*)?;'s*)

您的直接问题(通过您自己的评论)是您在正则表达式中使用捕获组,您应该使用非捕获组,或者更好的是,根本没有:

emailsString = 'aaaaaaa@bbbb.com xxxxxxx cccccc@dddd.com';
emails = emailsString.match(/['w-'.]+@['w]+'.+[a-zA-Z]{2,4}/g);
// emails = ["aaaaaaa@bbbb.com", "cccccc@dddd.com"]

您的模式很接近,您只需要使用全局标志,而不是捕获每个电子邮件计数的内部部分。我希望它有所帮助。

var re = /(?:['w-'.]+)@(?:(?:['w]+'.)+)(?:[a-zA-Z]{2,4})/g;
var emailsString = 'aaaaaaa@bbbb.com xxxxxxx cccccc@dddd.com';
var emails = emailsString.match(re); // ["aaaaaaa@bbbb.com", "cccccc@dddd.com"]

您可以简单地将字符串拆分为单个地址(在空格处),然后应用正则表达式。性能不应该有很大的不同。