我来自Python,所以我可能没有正确地看待这个问题。我希望创建一个相当复杂的正则表达式,并能够按名称访问匹配的字段。我似乎找不到一个好的例子。我得到的最接近的是:
package main
import (
  "fmt"
  "regexp"
)
var myExp = regexp.MustCompile(`(?P<first>\d+)\.(\d+).(?P<second>\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中的命名字段的方式。在围棋中做这件事的等效方法是什么?
或者,如果我需要将匹配转换成地图,那么制作并访问地图的最惯用的方式是什么?
发布于 2017-09-13 16:47:22
我没有资格发表评论,所以如果这不应该是一个“答案”,请原谅我,但是我发现上面的答案很有用,所以我把它打包成了一个函数:
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
}游乐场上的示例使用:https://play.golang.org/p/LPLND6FnTXO
希望这对其他人有帮助。喜欢在Go中命名捕获组的轻松性。
发布于 2018-12-03 05:07:39
当没有找到“命名组”的匹配时,其他方法会抛出一个错误。
但是,以下内容创建了一个map,其中包含实际找到的任何命名组:
func findNamedMatches(regex *regexp.Regexp, str string) map[string]string {
    match := regex.FindStringSubmatch(str)
    results := map[string]string{}
    for i, name := range match {
        results[regex.SubexpNames()[i]] = name
    }
    return results
}此方法将只返回带有命名组匹配的映射。如果没有匹配,它只会返回一个空地图。我发现如果找不到匹配的话,这要比抛出的错误容易得多。
https://stackoverflow.com/questions/20750843
复制相似问题