
本文介绍如何使用 Go 的 regexp 包高效提取并遍历多行键值对中的命名键(如 name、age、id)及其对应值,支持按条件筛选(如仅处理 id 字段)和直接索引访问特定匹配项(如第三组)。
本文介绍如何使用 go 的 `regexp` 包高效提取并遍历多行键值对中的命名键(如 `name`、`age`、`id`)及其对应值,支持按条件筛选(如仅处理 `id` 字段)和直接索引访问特定匹配项(如第三组)。
在 Go 中处理结构化文本(如配置片段、日志行或简单 KV 格式)时,正则表达式是常用工具。针对形如 key=value 的多行数据,我们通常用带捕获组的正则 (\w+)=(\w+) 提取键与值。但关键在于:如何系统性地遍历所有匹配结果,并对特定键(如 "id")执行定制逻辑?又如何跳过循环、直接获取第 N 个匹配项?
核心方法是使用 regexp.Regexp.FindAllStringSubmatch() —— 它返回一个二维字符串切片 [][]string,其中每个子切片对应一次完整匹配,而子切片内按捕获组顺序存放内容(索引 0 是整个匹配串,1 是第一个括号组,2 是第二个,依此类推)。
以下是一个完整示例:
package main
import (
"fmt"
"regexp"
)
func main() {
data := `name=peter
age=40
id=99`
// 编译正则:(\w+)=(\w+) → group1: key, group2: value
pat := regexp.MustCompile(`(\w+)=(\w+)`)
matches := pat.FindAllStringSubmatch([]byte(data), -1) // 注意:输入为 []byte
// ✅ 方式一:遍历所有匹配,按条件处理(如识别 "id")
var idValue string
for _, m := range matches {
key := string(m[1]) // group1 → key
value := string(m[2]) // group2 → value
fmt.Printf("Found: %s = %s\n", key, value)
if key == "id" {
idValue = value
}
}
fmt.Printf("Extracted ID: %s\n", idValue) // 输出: 99
// ✅ 方式二:直接索引访问(获取第三个匹配项,即索引 2)
if len(matches) >= 3 {
thirdKey := string(matches[2][1])
thirdVal := string(matches[2][2])
fmt.Printf("Third match: %s = %s\n", thirdKey, thirdVal) // 输出: id = 99
}
}⚠️ 注意事项:
-
FindAllStringSubmatch接收[]byte类型输入,需将字符串转为[]byte(data); - 每个
m是[]byte,需用string(m[i])转换为可读字符串; - 切片索引从
0开始,matches[2]表示第三个匹配(非“第三个捕获组”); - 使用前务必检查
len(matches),避免越界 panic; - 若需更高可读性,可结合
FindAllStringSubmatchIndex获取位置信息,或封装为结构体(如type KV struct{ Key, Value string })提升语义清晰度。
综上,通过 FindAllStringSubmatch + 循环/索引组合,即可灵活实现条件过滤与随机访问,无需手动解析或多次调用 FindStringSubmatch,兼顾简洁性与工程健壮性。

















