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":
- 第一个
(\d+)匹配开头的完整数字串"012"; - 接下来的
.*会从"012"之后开始,一直匹配到最后一个数字的前一位(因为后面的(\d+)需要至少匹配一个数字),也就是吃掉了" abc 01"; - 最后第二个
(\d+)只能匹配剩下的最后一个数字"2"。
解决方案
你只需要把贪婪的.*改成非贪婪模式的.*?,它会尽可能少地匹配字符,确保后面的(\d+)能匹配到完整的数字串:
修正后的正则代码:
r := regexp.MustCompile(`(\d+).*?(\d+)`)
如果你的场景里两个数字之间只有非数字字符,也可以用更精确的\D*(匹配零个或多个非数字字符),这样正则匹配的效率会更高:
r := regexp.MustCompile(`(\d+)\D*(\d+)`)
修改后运行代码,m[2]就会输出你预期的"012"了。
内容的提问来源于stack exchange,提问作者bearzyj
相关产品推荐
相关产品推荐

