首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Go正则表达式中的命名匹配

使用Go正则表达式中的命名匹配
EN

Stack Overflow用户
提问于 2013-12-23 20:38:42
回答 2查看 39.6K关注 0票数 57

我来自Python,所以我可能没有正确地看待这个问题。我希望创建一个相当复杂的正则表达式,并能够按名称访问匹配的字段。我似乎找不到一个好的例子。我得到的最接近的是:

代码语言:javascript
运行
复制
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中的命名字段的方式。在围棋中做这件事的等效方法是什么?

或者,如果我需要将匹配转换成地图,那么制作并访问地图的最惯用的方式是什么?

EN

回答 2

Stack Overflow用户

发布于 2017-09-13 16:47:22

我没有资格发表评论,所以如果这不应该是一个“答案”,请原谅我,但是我发现上面的答案很有用,所以我把它打包成了一个函数:

代码语言:javascript
运行
复制
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中命名捕获组的轻松性。

票数 17
EN

Stack Overflow用户

发布于 2018-12-03 05:07:39

当没有找到“命名组”的匹配时,其他方法会抛出一个错误。

但是,以下内容创建了一个map,其中包含实际找到的任何命名组:

代码语言:javascript
运行
复制
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
}

此方法将只返回带有命名组匹配的映射。如果没有匹配,它只会返回一个空地图。我发现如果找不到匹配的话,这要比抛出的错误容易得多。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20750843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档