使用JS正则提取有效邮箱地址,如何修正匹配末尾连字符的问题
修正方案
你原有正则出错的核心原因是host部分的后缀匹配规则没有限制每一段域名必须以字母结尾,导致末尾带连字符的无效域名也能被匹配。
修正后的正则
/(?<!\S)[a-z0-9]+(?:[._-][a-z0-9]+)*@[a-z]+(?:-[a-z]+)*(?:\.[a-z]+(?:-[a-z]+)*){1,}(?!\S)/g
规则匹配说明
- user部分
[a-z0-9]+(?:[._-][a-z0-9]+)*
- 开头和结尾必须为字母/数字,中间可插入单个
./_/-,避免出现连续特殊字符、首尾带特殊字符的无效user格式,完全符合要求。
- host部分
[a-z]+(?:-[a-z]+)*(?:\.[a-z]+(?:-[a-z]+)*){1,}
- 每一段域名都以字母开头、字母结尾,中间仅可插入单个连字符
- - 后缀段至少出现1次,保证host总段数≥2,完全满足你的规则要求,彻底排除末尾带连字符的无效匹配。
- 前后的
(?<!\S)和(?!\S)断言保证匹配的是独立完整的邮箱,不会从普通文本中错误截取邮箱片段。
匹配验证
- 有效匹配项:
s.kiki@hotmail.co.uk✅no-reply@github-bg.com.uk.bg✅no_reply@github-bg.com.uk.bg✅
- 无效排除项:
suport@github.com-❌(后缀末尾带连字符)test@-test.com❌(主域名开头带连字符)test.@test.com❌(user末尾带特殊字符)
内容的提问来源于stack exchange,提问作者Маргарита Георгиева
相关产品推荐
相关产品推荐

