登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-27 22:18:31 321浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《使用 Go 正则表达式中的命名匹配》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我来自 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 中访问命名字段的方式。在 go 中执行此操作的等效方法是什么?

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

正确答案

您可以通过以下方式引用您命名的捕获组map

package main

import (
    "fmt"
    "regexp"
)

var myExp = regexp.MustCompile(`(?P\d+)\.(\d+).(?P\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**](https://play.golang.org/p/scEnGr89tIA)

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《使用 Go 正则表达式中的命名匹配》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>