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