Capturing grouping for regex function replace in Go
func main() { | |
str := "abc foo:bar def baz:qux ghi" | |
re := regexp.MustCompile("([a-z]+):([a-z]+)") | |
result := ReplaceAllStringSubmatchFunc(re, str, func(groups []string) string { | |
return groups[1] + "." + groups[2] | |
}) | |
fmt.Printf("'%s'\n", result) | |
} |
import "regexp" | |
func ReplaceAllStringSubmatchFunc(re *regexp.Regexp, str string, repl func([]string) string) string { | |
result := "" | |
lastIndex := 0 | |
for _, v := range re.FindAllSubmatchIndex([]byte(str), -1) { | |
groups := []string{} | |
for i := 0; i < len(v); i += 2 { | |
groups = append(groups, str[v[i]:v[i+1]]) | |
} | |
result += str[lastIndex:v[0]] + repl(groups) | |
lastIndex = v[1] | |
} | |
return result + str[lastIndex:] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
bad function ))
change
on
Otherwise, if the group is not found, there will be an error.
For example:
(?:aa(xxx)bbb)?(yyy)