Regexp在表达式中查找组

时间:2018-03-07 16:22:33

标签: regex go

我有一个代码示例,

sliceArgument := args[1] // should look like e.g. `[1:5]` or `[:5]` or `[1:]`
expression := "^\\[(?P<first>\\d*?):(?P<last>\\d*?)\\]$"
r := regexp.MustCompile(expression)
r.FindStringSubmatch(sliceArgument)
startEndArgumentList := r.SubexpNames()
if len(startEndArgumentList)  >= 2 {
    argMap[`first`] = startEndArgumentList[0]
    argMap[`last`] = startEndArgumentList[1]
}

当我将[1:5]作为args[1]传递时 - 我假设SubexpNames会给我两组的值。相反,SubexpNames会返回:'', 'first', 'last'。 这有什么不对?

1 个答案:

答案 0 :(得分:2)

Docs说这个数组的元素总是一个空字符串。

  

func (*Regexp) SubexpNames

     

func (re *Regexp) SubexpNames() []string

     

SubexpNames返回此Regexp中带括号的子表达式的名称。第一个子表达式的名称是名称[1],因此如果m是匹配切片,则m [i]的名称是SubexpNames()[i]。 由于无法命名整个Regexp,因此名称[0]始终为空字符串。不应修改切片。

看看文档中的示例:

func main() {
    re := regexp.MustCompile("(?P<first>[a-zA-Z]+) (?P<last>[a-zA-Z]+)")
    fmt.Println(re.MatchString("Alan Turing"))
    fmt.Printf("%q\n", re.SubexpNames())
    reversed := fmt.Sprintf("${%s} ${%s}", re.SubexpNames()[2], re.SubexpNames()[1])
    fmt.Println(reversed)
    fmt.Println(re.ReplaceAllString("Alan Turing", reversed))
}

他们也使用re.SubexpNames()[2]re.SubexpNames()[1](不是re.SubexpNames()[0])。

另外:SubexpNames返回组的名称,而不是匹配的值。要获取值,请使用FindStringSubmatch,请参阅this answer及其demo

相关问题