Golang验证邮箱格式的正则表达式

在Golang中如何用正则表达式验证邮箱格式?我尝试了几个正则表达式但都不太完善,有些常见的邮箱格式无法正确匹配。请问有没有一个比较全面且经过验证的正则表达式可以推荐?最好能支持常见的邮箱格式如带点、加号等特殊符号的情况。

2 回复

可以用这个正则表达式:

^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$

使用示例:

package main

import (
    "regexp"
    "fmt"
)

func isValidEmail(email string) bool {
    pattern := `^[a-zA-Z0-9.!#$%&'*+/=?^_` + "`" + `{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$`
    matched, _ := regexp.MatchString(pattern, email)
    return matched
}

func main() {
    fmt.Println(isValidEmail("test@example.com")) // true
    fmt.Println(isValidEmail("invalid.email"))    // false
}

这个正则覆盖了RFC 5322标准的大部分邮箱格式要求,包括:

  • 允许特殊字符:! # $ % & ’ * + - / = ? ^ _ ` { | } ~
  • 域名部分支持多级域名
  • 长度限制检查

不过要注意,最严格的邮箱验证还是发送验证邮件最靠谱!

更多关于Golang验证邮箱格式的正则表达式的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中验证邮箱格式可以使用正则表达式。以下是一个常用的正则表达式和示例代码:

package main

import (
    "fmt"
    "regexp"
)

func isValidEmail(email string) bool {
    // 邮箱验证正则表达式
    pattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
    matched, _ := regexp.MatchString(pattern, email)
    return matched
}

func main() {
    emails := []string{
        "test@example.com",
        "invalid.email",
        "user@domain.co.uk",
        "name@sub.domain.com",
    }
    
    for _, email := range emails {
        fmt.Printf("%s: %t\n", email, isValidEmail(email))
    }
}

输出结果:

test@example.com: true
invalid.email: false
user@domain.co.uk: true
name@sub.domain.com: true

正则表达式说明:

  • ^$ 分别表示字符串的开始和结束
  • [a-zA-Z0-9._%+-]+ 匹配用户名部分(字母、数字、点、下划线、百分号等)
  • @ 匹配@符号
  • [a-zA-Z0-9.-]+ 匹配域名部分
  • \. 匹配点号
  • [a-zA-Z]{2,} 匹配顶级域名(至少2个字母)

这个正则表达式能够验证大多数常见的邮箱格式,但请注意:

  1. 完全符合RFC标准的邮箱验证非常复杂
  2. 实际应用中可能需要根据具体需求调整
  3. 建议配合其他验证方式(如发送验证邮件)使用

如果需要更严格的验证,可以考虑使用专门的验证库,如 github.com/asaskevich/govalidator

回到顶部