如何在Golang中解析长字符串中的电子邮件地址

xuo3flqw  于 2022-12-07  发布在  Go
关注(0)|答案(4)|浏览(260)

如何从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"

这将返回所有电子邮件的列表:【吉姆.哈尔伯特@ gmail.com,苹果.派@ gmail.com,等等......】
每个电子邮件地址都以“mail=”开始,以逗号“,"结尾。

cidc1ykv

cidc1ykv1#

为此,您需要将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)
    }
}
mnemlml8

mnemlml82#

虽然我同意用户datenwolf的评论,但这里是另一个不涉及正则表达式的版本。
它还处理更复杂的电子邮件格式,包括本地部分中的逗号。使用regexp不易实现的东西。
请参阅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)
    }

}
7fyelxc5

7fyelxc53#

您可以使用此软件包来执行以下操作:
https://github.com/hamidteimouri/htutils/blob/main/htregex/htregex.go

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

64jmpszr4#

您可以使用golang原始包是regexp.Compile或regexp.MustCompile

r, _ := regexp.Compile(regexEmail)
    newVariable := `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`

    fmt.Printf("%#v\n", r.FindStringSubmatch(newVariable))
    fmt.Printf("%#v\n", r.SubexpNames())

相关问题