【问题标题】:How to parse email addresses from a long string in Golang如何从 Golang 中的长字符串中解析电子邮件地址
【发布时间】:2022-11-06 22:42:46
【问题描述】:

如何从 Golang 中的长字符串中仅提取电子邮件地址?例如:

"a bunch of irrelevant text fjewiwofjfjvnvkdlslsosiejwoqlwpwpwo
 mail=jim.halpert@gmail.com,ou=f,c=US
 mail=apple.pie@gmail.com,ou=f,c=US
 mail=hello.world@gmail.com,ou=f,c=US
 mail=alex.alex@gmail.com,ou=f,c=US
 mail=bob.jim@gmail.com,ou=people,ou=f,c=US
 mail=arnold.schwarzenegger@gmail.com,ou=f,c=US"

这将返回所有电子邮件的列表: [jim.halpert@gmail.com、apple.pie@gmail.com 等...]

每个电子邮件地址都以“mail=”开头并以逗号“,”结尾。

【问题讨论】:

  • 你试过什么?你有什么问题?发布您的尝试,最好是minimal reproducible example
  • 这是来自 x509 (TLS) 证书吗?如果是这样,请获取一个 x509 解析器库来提取邮件字段。众所周知,电子邮件地址很难应用过滤规则,因为它们允许引用和转义的所有不同方式。从任意单词汤中可靠地提取电子邮件地址几乎是不可能的。可靠的方法是解析包含电子邮件地址的实际容器格式。因此,如果这来自 x509 证书,那么您要解析证书,不是电子邮件地址

标签: go


【解决方案1】:

为此,您需要将 long go 字符串分解为您需要的部分。您可以使用正则表达式进行过滤和搜索,以匹配您在上面看到的电子邮件模式。

这是一段使用正则表达式的代码,首先获取带有"mail="的部分,然后进一步格式化电子邮件,删除尾随,

 import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    var re = regexp.MustCompile(`(?m)mail=[A-Za-z.@0-9]+,`)
    var str = `a bunch of irrelevant text fjewiwofjfjvnvkdlslsosiejwoqlwpwpwo
 mail=jim.halpert@gmail.com,ou=f,c=US
 mail=apple.pie@gmail.com,ou=f,c=US
 mail=hello.world@gmail.com,ou=f,c=US
 mail=alex.alex@gmail.com,ou=f,c=US
 mail=bob.jim@gmail.com,ou=people,ou=f,c=US
 mail=arnold.schwarzenegger@gmail.com,ou=f,c=US`

    for i, match := range re.FindAllString(str, -1) {
        fmt.Println(match, "found at index", i)
        email := strings.Split(match, "=")[1]

        email = strings.ReplaceAll(email, ",", "")

        fmt.Print(email)
    }
}

【讨论】:

    【解决方案2】:

    虽然我同意用户 datenwolf 的评论,但这里是另一个不涉及正则表达式的版本。

    它还可以处理更复杂的电子邮件格式,包括本地部分中的逗号。使用正则表达式难以实现的东西。

    https://stackoverflow.com/a/2049510/11892070

    
    import (
        "bufio"
        "fmt"
        "strings"
    )
    
    var str = `a bunch of irrelevant text fjewiwofjfjvnvkdlslsosiejwoqlwpwpwo
    mail=jim.halpert@gmail.com,ou=f,c=US
    mail=apple.pie@gmail.com,ou=f,c=US
    mail=hello.world@gmail.com,ou=f,c=US
    mail=alex.alex@gmail.com,ou=f,c=US
    mail=bob.jim@gmail.com,ou=people,ou=f,c=US
    mail=arnold.schwarzenegger@gmail.com,ou=f,c=US
    mail=(comented)arnold.schwarzenegger@gmail.com,ou=f,c=US
    mail="(with comma inside)arnold,schwarzenegger@gmail.com",ou=f,c=US
    mail=nocommaatall@gmail.com`
    
    func main() {
    
        var emails []string
    
        sc := bufio.NewScanner(strings.NewReader(str))
    
        for sc.Scan() {
            t := sc.Text()
            if !strings.HasPrefix(t, "mail=") {
                continue
            }
            t = t[5:]
    
            // Lookup for the next comma after the @.
            at := strings.Index(t, "@")
            comma := strings.Index(t[at:], ",")
            if comma < 0 {
                email := strings.TrimSpace(t)
                emails = append(emails, email)
                continue
            }
            comma += at
            email := strings.TrimSpace(t[:comma])
            emails = append(emails, email)
        }
    
        for _, e := range emails {
            fmt.Println(e)
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      你可以使用这个包来做到这一点:

      https://github.com/hamidteimouri/htutils/blob/main/htregex/htregex.go

      
      // Emails finds all email strings
      func Emails(text string) []string {
          return match(text, EmailsRegex)
      }
      
      

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        相关资源
        最近更新 更多