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

Golang regexp FindStringSubmatch()返回最后分组结果异常问题咨询

问题分析与解决

这是正则表达式里贪婪匹配导致的典型问题,我来给你拆解一下:

首先看你的代码:

package main
import (
	"fmt"
	"regexp"
)
func main() {
	raw := "012 abc 012"
	r := regexp.MustCompile(`(\d+).*(\d+)`)
	m := r.FindStringSubmatch(raw)
	fmt.Printf("len(m)=%v\n%v\n%v\n%v\n", len(m), m[0], m[1], m[2])
}

运行后输出:

len(m)=3
012 abc 012
012
2

问题根源

你的正则(\d+).*(\d+)中,.*是贪婪模式的通配符——它会尽可能匹配最多的字符,直到后面的表达式无法匹配为止。具体到你的字符串"012 abc 012":

  1. 第一个(\d+)匹配开头的完整数字串"012";
  2. 接下来的.*会从"012"之后开始,一直匹配到最后一个数字的前一位(因为后面的(\d+)需要至少匹配一个数字),也就是吃掉了" abc 01";
  3. 最后第二个(\d+)只能匹配剩下的最后一个数字"2"。

解决方案

你只需要把贪婪的.*改成非贪婪模式的.*?,它会尽可能少地匹配字符,确保后面的(\d+)能匹配到完整的数字串:

修正后的正则代码:

r := regexp.MustCompile(`(\d+).*?(\d+)`)

如果你的场景里两个数字之间只有非数字字符,也可以用更精确的\D*(匹配零个或多个非数字字符),这样正则匹配的效率会更高:

r := regexp.MustCompile(`(\d+)\D*(\d+)`)

修改后运行代码,m[2]就会输出你预期的"012"了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:42:46