package utils import ( "errors" "regexp" ) // HandleRegexp handles a regex with named capture groups. // If the given regexp does not have any named capture group, or if no match is found, an error is returned // Matches are returned as a map which keys are the capture groups names func HandleRegexp(dat string, pattern regexp.Regexp) (res []map[string]string, err error) { namedGroups := 0 for _, n := range pattern.SubexpNames() { if n != "" { namedGroups++ } } if namedGroups == 0 { return nil, errors.New("no named subgroup in pattern") } matches := pattern.FindAllStringSubmatch(dat, -1) if matches == nil { return nil, errors.New("no match found") } res = make([]map[string]string, 0) for _, line := range matches { subMatchMap := make(map[string]string) for i, name := range pattern.SubexpNames() { if i != 0 { subMatchMap[name] = string(line[i]) } } res = append(res, subMatchMap) } return } // HandleKeyValRegexRes merges a list of maps containing result as a key/value format // // Input maps all have the following format: // // { // "key": "some_key", // "value": "some_val", // } // // Final result will have the format // // { // "some_key": "some_val", // } func HandleKeyValRegexRes(rawMatches []map[string]string) map[string]string { matchedMap := make(map[string]string) for _, m := range rawMatches { currKey := "" currVal := "" for k, v := range m { if k == "key" { currKey = v } else if k == "value" { currVal = v } // All other keys are ignored // Should not happen given the given regexp } if currKey != "" && currVal != "" { matchedMap[currKey] = currVal } } return matchedMap }