
本文介绍如何使用 Go 的 regexp 包高效提取并遍历多行键值对中的命名键(如 name、age、id)及其对应值,并支持条件处理(如仅当键为 "id" 时提取值)和随机访问(如直接获取第 N 个匹配项)。
本文介绍如何使用 go 的 regexp 包高效提取并遍历多行键值对中的命名键(如 name、age、id)及其对应值,并支持条件处理(如仅当键为 "id" 时提取值)和随机访问(如直接获取第 n 个匹配项)。
在 Go 中处理结构化文本(如配置片段、简单 KV 格式)时,正则表达式是快速提取字段的有效工具。假设原始数据如下:
name=peter age=40 id=99
我们可使用带捕获组的正则 (\w+)=(\w+) 同时匹配键与值。关键在于:FindAllStringSubmatch 返回的是 [][]string —— 每个子切片对应一次完整匹配,索引 [0] 是整个匹配字符串,[1] 和 [2] 分别对应第一个和第二个捕获组(即键与值)。
以下是一个完整、可运行的示例:
package main
import (
"fmt"
"regexp"
)
func main() {
data := `name=peter
age=40
id=99`
pat := regexp.MustCompile(`(\w+)=(\w+)`)
matches := pat.FindAllStringSubmatch([]byte(data), -1) // 注意:输入为 []byte
// ✅ 遍历所有匹配,分别处理键和值
for i, match := range matches {
key := string(match[1])
value := string(match[2])
fmt.Printf("Match %d: key=%q, value=%q\n", i+1, key, value)
// ? 条件处理:当键为 "id" 时,赋值给新变量
if key == "id" {
newVar := value
fmt.Printf("→ Detected 'id': assigning %q to newVar\n", newVar)
}
}
// ⚡ 直接访问第 N 个匹配(注意:索引从 0 开始)
if len(matches) >= 3 {
third := matches[2]
key := string(third[1])
value := string(third[2])
fmt.Printf("Third match → key=%q, value=%q\n", key, value)
} else {
fmt.Println("Warning: fewer than 3 matches found.")
}
}注意事项:
-
FindAllStringSubmatch接收[]byte类型输入,需将字符串转为字节切片([]byte(data)); - 每个
match是[]string,其中match[0]是完整匹配(如"id=99"),match[1]和match[2]才是捕获组内容; - 访问
matches[N]前务必检查切片长度,避免 panic; - 若需更健壮的解析(如支持空格、引号、换行值),建议改用
bufio.Scanner+strings.Split或专用解析器,正则适用于轻量、格式严格的场景。
通过合理组合 FindAllStringSubmatch 与切片遍历/索引,你既能实现灵活的条件逻辑,也能获得 O(1) 的随机访问能力——无需手动计数或状态机,简洁而高效。

















