Go语言正则匹配问题:如何提取目标子串而非完整匹配结果?
解决方法
你不需要修改正则表达式,问题出在使用的提取方法上:FindString返回的是整个正则匹配的完整字符串,而你要的是捕获分组里的内容,应该用FindStringSubmatch方法。
代码示例
package main import ( "fmt" "regexp" ) func main() { mystr := "xyz/10021abc/f123" mystr2 := "abc/10021abd/c222" r := regexp.MustCompile(`(?:xyz\/|abc\/)(.+)\/`) // 提取第一个字符串的目标内容 if match := r.FindStringSubmatch(mystr); len(match) > 1 { fmt.Println(match[1]) // 输出 10021abc } // 提取第二个字符串的目标内容 if match := r.FindStringSubmatch(mystr2); len(match) > 1 { fmt.Println(match[1]) // 输出 10021abd } }
可选:优化正则表达式
原正则里的.+是贪婪匹配,虽然当前场景没问题,但如果字符串结构更复杂可能会出错。可以把.+换成[^/]+,精准匹配两个斜杠之间的非斜杠字符,避免意外匹配:
r := regexp.MustCompile(`(?:xyz\/|abc\/)([^/]+)\/`)
内容的提问来源于stack exchange,提问作者drdot
相关产品推荐
相关产品推荐

