使用正则表达式验证电子邮件,其中域部分中的扩展名数量可能会有所不同

Validate Email with regular expression where the number of extensions in the domain part can vary

我需要一个正则表达式来匹配这样的模式。我试过用这个 -

if(str.match(/^([a-zA-Z-\.]+)@([a-zA-Z]{1,5})\.([a-zA-Z]{1,5})(\.[a-zA-Z]{1,5})?(\.[a-zA-Z]{2,3})?$/)){
  console.log("the email is valid");
}

但这将 user@aaa.bb.cccc 视为有效,而它应该 不是

邮箱有效的全部要求-

  1. 电子邮件的用户名部分只能包含单词(不区分大小写)、点 (.) 和破折号 (-)。长度 1 个或多个字符。

  2. 域名部分可以有2到4个后缀。比如username@ext.ext.ext.ext这个 电子邮件有 4 个扩展名。

  3. 所有分机只能有单词(不区分大小写),长度可以为1到5个字符 long 除了最后一个扩展名。最后一个扩展名的长度只能是 2 到 3 个字符。为了 例如,

    user@aaa.bb.cccc.dd 有效

    user@aaa.bv.cccc 无效

    我在解决这部分问题时遇到了问题。由于扩展计数可能会有所不同,我不知道如何检查电子邮件的最后部分是否只有 2 到 3 个字符?

我知道这类问题以前可能有人回答过。我是正则表达式的新手,我找不到解决问题的方法。

您可以在 @.

之后匹配一个 [a-zA-Z]{1,5}

再匹配0到2次\.[a-zA-Z]{1,5},最后再匹配\.[a-zA-Z]{2,3},共匹配2-4个部分

^[a-zA-Z.-]+@[a-zA-Z]{1,5}(?:\.[a-zA-Z]{1,5}){0,2}\.[a-zA-Z]{2,3}$

Regex demo

如果你想匹配“单词”,你也可以使用 \w 而不是使用 [a-zA-Z] 来匹配数字和 _

const pattern = /^[a-zA-Z.-]+@[a-zA-Z]{1,5}(?:\.[a-zA-Z]{1,5}){1,2}\.[a-zA-Z]{2,3}$/;
[
  "user@aaa.bb.cccc.dd",
  "user@aaa.bb.cccc.dd.ee",
  "user@aaa.bv.cccc"
].forEach(s => {
  console.log(`the email is ${pattern.test(s) ? "" : "not "}valid for ${s}`)
});