diff --git a/regex/matching.go b/regex/matching.go index 4d6b4e3..faf56a5 100644 --- a/regex/matching.go +++ b/regex/matching.go @@ -205,6 +205,29 @@ func (re Reg) FindAllSubmatch(str string) []Match { return indices } +// FindAllSubmatch returns a double-slice of strings. Each slice contains the text of a match, including all submatches. +// A return value of nil indicates no match. +func (re Reg) FindAllStringSubmatch(str string) [][]string { + match := re.FindAllSubmatch(str) + if len(match) == 0 { + return nil + } + rtv := make([][]string, len(match)) + for i := range rtv { + rtv[i] = make([]string, re.numGroups+1) + } + rtv = funcMap(match, func(m Match) []string { + return funcMap(m, func(g Group) string { + if g.IsValid() { + return str[g.StartIdx:g.EndIdx] + } else { + return "" + } + }) + }) + return rtv +} + func addStateToList(str []rune, idx int, list []nfaState, state nfaState, threadGroups []Group, visited []nfaState, preferLongest bool) []nfaState { if stateExists(list, state) || stateExists(visited, state) { return list