用 regexp.FindAllString 提取连续数字片段最简单,需先 regexp.MustCompile(\d+) 编译正则,否则 panic;它匹配纯数字如 "123" 但不匹配 "3.14" 或全角数字。

用 regexp.FindAllString 提取连续数字片段最简单
直接匹配所有连续的数字字符(如 "123"、"007"),不区分整数/浮点,也不做类型转换。适合日志解析、ID 提取等场景。
常见错误是写成 regexp.FindString —— 它只返回第一个匹配,漏掉后续数字;或者正则写成 \d+ 却忘了编译,panic 报错 nil pointer dereference。
- 必须先调用
regexp.Compile,不能直接传字面量正则给查找函数 -
\d+能匹配"abc123def456"中的"123"和"456",但不会匹配"3.14"或"-42" - 如果字符串里有中文数字或全角数字(如“123”),
\d默认不识别,得改用 Unicode 类别\p{Nd}+
re := regexp.MustCompile(`\d+`)
nums := re.FindAllString("用户ID: 10086,订单号:20240517", -1) // 返回 []string{"10086", "20240517"}
要提取浮点数或带符号数字,得用更精确的正则模式
\d+ 太粗,会把 "3.14" 拆成 "3" 和 "14",也会漏掉负号和小数点。真实数值往往带符号、小数、科学计数法(如 "-2.5e-3")。
别硬写一个“完美匹配所有数值”的正则——它要么漏边角 case,要么过度匹配(比如把 "123abc" 的 "123" 当作合法数)。按实际输入可控程度选策略:
- 如果来源可信(如 API 返回的 JSON 字段值),直接用
json.Unmarshal解析,比正则稳得多 - 如果只是日志里找类似
"cost: 29.99"这种格式,用-?\d+\.\d+就够了 - 需要兼容整数、浮点、负数?试试
-?\d+\.?\d*,但注意它会匹配空小数点"123.",上线前务必用真实数据测
re := regexp.MustCompile(`-?\d+\.\d+`)
re.FindAllString("温度:-23.5℃,误差±0.01", -1) // ["-23.5", "0.01"]
strconv.ParseFloat 和 strconv.Atoi 是转换环节的必经关卡
正则只负责“切出字符串”,真正变成数字还得靠 strconv 包。跳过这步直接用 fmt.Sscanf 或反射转,容易静默失败或 panic。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
典型坑是忽略 err 返回值:strconv.Atoi("123abc") 返回 123, nil?错,它返回 0, error。因为 Atoi 要求整个字符串可转,不是前缀匹配。
-
strconv.Atoi只认纯整数字符串("42"、"-7"),"42px"或" 42"都失败 -
strconv.ParseFloat(s, 64)对前导空格宽容,但遇到非法字符(如"3.14abc")仍报错,需手动截断或预清洗 - 性能敏感场景下,避免在循环里反复
regexp.Compile,应提前编译好复用
s := "123"
if n, err := strconv.Atoi(s); err == nil {
fmt.Println(n * 2) // 246
}
别在 HTML 或富文本里硬上正则提数字
如果目标字符串来自 HTML 片段(比如 "价格:¥99.90"),优先用 golang.org/x/net/html 解析 DOM,再取文本内容。正则处理嵌套标签、转义字符、注释时极易崩。
例如 regexp.MustCompile(`¥(\d+\.\d+)`).FindStringSubmatch 看似能抓价格,但遇上 "¥99.90"、"99.90" 或注释 就歇菜。
- HTML 字符串 ≠ 普通文本,结构复杂度远超正则能力边界
- 哪怕只是简单提取,也建议先用
html.UnescapeString清洗实体,再交给正则 - 若只是从 HTTP 响应体中抽几个字段,考虑用
goquery库,代码更直白,维护成本更低
正则提数字这事,难点从来不在“怎么写模式”,而在“输入到底有多脏”。线上环境里,多一个空格、少一个负号、混一段 base64,都可能让看似健壮的正则突然失效。留好 err 分支,加几条真实脏数据的单元测试,比调半天正则更省时间。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










