我正在尝试匹配一个正则表达式,并获取匹配的捕获组名称。当正则表达式只匹配一次字符串时有效,但是如果它多次匹配字符串,则SubexpNames不会返回重复的名称。

这是一个例子:

package main

import (
    "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"]]

是否可以获取每个子匹配项的捕获组名称?

最佳答案

组名和位置是固定的:

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)
    }
}

关于regex - Golang正则表达式命名组和子匹配项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34949554/

10-12 06:54