我来自python,所以我可能只是没有以正确的方式看待它.我想创建一个相当复杂的正则表达式,并能够按名称访问字段匹配.我似乎无法找到一个好例子.我设法得到的最接近的是:
package main import ( "fmt" "regexp" ) var myExp = regexp.MustCompile(`(?P\d+)\.(\d+).(?P \d+)`) func main() { fmt.Printf("%+v", myExp.FindStringSubmatch("1234.5678.9")) match := myExp.FindStringSubmatch("1234.5678.9") for i, name := range myExp.SubexpNames() { fmt.Printf("'%s'\t %d -> %s\n", name, i, match[i]) } //fmt.Printf("by name: %s %s\n", match["first"], match["second"]) }
注释掉的行是我期望访问python中的命名字段的方式.什么是相同的方式来做到这一点?或者,如果我需要将匹配转换为地图,那么制作然后访问地图最常用的方法是什么?
您可以通过以下方式引用您的命名捕获组map
:
package main import ( "fmt" "regexp" ) var myExp = regexp.MustCompile(`(?P<first>\d+)\.(\d+).(?P<second>\d+)`) func main() { match := myExp.FindStringSubmatch("1234.5678.9") result := make(map[string]string) for i, name := range myExp.SubexpNames() { if i != 0 && name != "" { result[name] = match[i] } } fmt.Printf("by name: %s %s\n", result["first"], result["second"]) }
GoPlay
我没有评论的声誉,所以请原谅我,如果这不应该是一个'答案',但我发现上面的答案很有帮助,所以我把它包装成一个函数:
func reSubMatchMap(r *regexp.Regexp, str string) (map[string]string) { match := r.FindStringSubmatch(str) subMatchMap := make(map[string]string) for i, name := range r.SubexpNames() { if i != 0 { subMatchMap[name] = match[i] } } return subMatchMap }
Playground上的示例用法:https: //play.golang.org/p/LPLND6FnTXO
希望这对其他人有帮助.喜欢Go中命名捕获组的简易性.