我有一个代码示例
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'
。怎么了
最佳答案
Docs说,此数组的元素始终是一个空字符串。func (*Regexp) SubexpNames
func (re *Regexp) SubexpNames() []string
SubexpNames返回此正则表达式中带括号的子表达式的名称。第一个子表达式的名称为names [1],因此,如果m是匹配片,则m [i]的名称为SubexpNames()[i]。 由于不能对整个Regexp进行命名,所以names [0]始终为空字符串。 不应修改 slice 。
看一下文档中的示例:
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。