golang regexp FindStringSubmatch()没有返回正确的最后一组

I am using go1.10 darwin/amd64, here is the code:

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
%v
%v
%v
", len(m), m[0], m[1], m[2])
}

Output is:

len(m)=3

012 abc 012

012

2

You can also run it here: https://play.golang.org/p/i2zlhClB72e

I expect that the output of m[2] is "012" but not "2".

Can anyone let me know where the issue is? Thanks very much.

Regular expressions are greedy, so .* will match 01 leaving just 2 to match the final \d+.

You probably want to change your expression to something like the following: (\d+)[^\d]*(\d+)$ to match a sequence of digits (captured), anything but a sequence of digits, a sequence of digits (captured), and the end of line.

The same code for the rest will print what you expected:

len(m)=3
012 abc 012
012
012