为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 正则表达式命名组和子匹配

Golang 正则表达式命名组和子匹配

Go
富国沪深 2021-12-07 15:04:39
我正在尝试匹配正则表达式并获取匹配的捕获组名称。这在正则表达式只匹配字符串一次时有效,但如果匹配字符串不止一次,SubexpNames则不会返回重复的名称。下面是一个例子:package mainimport (    "fmt"    "regexp")func main() {    re := regexp.MustCompile("(?P<first>[a-zA-Z]+) ")    fmt.Printf("%q\n", re.SubexpNames())    fmt.Printf("%q\n", re.FindAllStringSubmatch("Alan Turing ", -1))}输出是:["" "first"][["Alan " "Alan"] ["Turing " "Turing"]]是否可以获得每个子匹配的捕获组名称?
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

组名和位置是固定的:


re := regexp.MustCompile("(?P<first>[a-zA-Z]+) ")

groupNames := re.SubexpNames()

for matchNum, match := range re.FindAllStringSubmatch("Alan Turing ", -1) {

    for groupIdx, group := range match {

        name := groupNames[groupIdx]

        if name == "" {

            name = "*"

        }

        fmt.Printf("#%d text: '%s', group: '%s'\n", matchNum, group, name)

    }

}


查看完整回答
反对 回复 2021-12-07
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

这可能包含在 Go 1.14(2020 年第一季度,尚未确认)中。

参见“提案:正则表达式:添加(*Regexp).SubexpIndex#32420 ”。更新:它已包含在 Go 1.15(2020 年 8 月)的commit 782fcb4中。


// SubexpIndex returns the index of the first subexpression with the given name,

// or else -1 if there is no subexpression with that name.

//

// Note that multiple subexpressions can be written using the same name, as in

// (?P<bob>a+)(?P<bob>b+), which declares two subexpressions named "bob".

// In this case SubexpIndex returns the index of the leftmost such subexpression

// in the regular expression.

func (*Regexp) SubexpIndex(name string) int

这在CL 187919 中进行了讨论。


re := regexp.MustCompile(`(?P<first>[a-zA-Z]+) (?P<last>[a-zA-Z]+)`)

fmt.Println(re.MatchString("Alan Turing"))

matches := re.FindStringSubmatch("Alan Turing")

lastIndex := re.SubexpIndex("last")

fmt.Printf("last => %d\n", lastIndex)

fmt.Println(matches[lastIndex])


// Output:

// true

// last => 2

// Turing


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信