You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang如何从长字符串中按规则解析提取目标邮箱地址

Golang 按指定规则从长字符串提取邮箱地址

问题说明

已知输入为混杂大量无关内容的长文本,符合规则的目标邮箱满足固定格式:

  • 每个邮箱前紧接固定前缀 mail=
  • 每个邮箱后紧接分隔符 ,

示例输入内容如下:

input := `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 hello.world@gmail.com ...]。

实现方案

直接用Go标准库自带的regexp包写正则匹配就行,不用装第三方依赖,代码短还不容易出问题,就算mail=和后面的逗号被换行拆开也能正常匹配到。
核心正则规则:mail=([^,]+),

  • 先匹配固定前缀mail=
  • 捕获组([^,]+)匹配所有非逗号字符,正好对应中间的邮箱内容
  • 最后匹配固定后缀,

完整可运行代码:

package main

import (
	"fmt"
	"regexp"
)

func main() {
	// 输入长文本
	input := `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`

	// 编译正则,启动时提前校验正则语法
	re := regexp.MustCompile(`mail=([^,]+),`)
	// 查找所有匹配项,传入-1表示匹配全部结果
	matches := re.FindAllStringSubmatch(input, -1)

	// 遍历结果,提取捕获组中的邮箱内容
	var emails []string
	for _, match := range matches {
		// match[0]是完整匹配到的整段字符串,match[1]是第一个捕获组的内容,也就是目标邮箱
		emails = append(emails, match[1])
	}

	// 打印输出结果
	fmt.Println(emails)
}

运行输出:

[jim.halpert@gmail.com apple.pie@gmail.com hello.world@gmail.com alex.alex@gmail.com bob.jim@gmail.com arnold.schwarzenegger@gmail.com]

要是这个逻辑跑在超高性能要求的场景,也可以不用正则,循环用strings.Index找所有mail=的位置,再往后找第一个逗号,截中间的内容就行,能省一点正则匹配的开销。但绝大多数业务场景用正则就够了,好写也好改,性能差不了多少。

内容的提问来源于stack exchange,提问作者discovering

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:18:15