| package main |
| |
| import ( |
| "regexp" |
| "strings" |
| ) |
| |
| var isStrutilInitialized bool |
| var spacesRe *regexp.Regexp |
| |
| func maybeInitStrutil() { |
| if isStrutilInitialized { |
| return |
| } |
| |
| var err error |
| spacesRe, err = regexp.Compile(`\s+`) |
| if err != nil { |
| panic(err) |
| } |
| isStrutilInitialized = true |
| } |
| |
| func splitSpaces(s string) []string { |
| maybeInitStrutil() |
| s = strings.TrimSpace(s) |
| if s == "" { |
| return []string{} |
| } |
| return spacesRe.Split(s, -1) |
| } |
| |
| func matchPattern(pat string, str string) bool { |
| patPercentIndex := strings.IndexByte(pat, '%') |
| if patPercentIndex < 0 { |
| return pat == str |
| } |
| |
| patPrefix := pat[:patPercentIndex] |
| patSuffix := pat[patPercentIndex+1:] |
| return strings.HasPrefix(str, patPrefix) && strings.HasSuffix(str, patSuffix) |
| } |
| |
| func substPattern(pat string, repl string, str string) string { |
| patPercentIndex := strings.IndexByte(pat, '%') |
| if patPercentIndex < 0 { |
| if str == pat { |
| return repl |
| } else { |
| return str |
| } |
| } |
| |
| patPrefix := pat[:patPercentIndex] |
| patSuffix := pat[patPercentIndex+1:] |
| replPercentIndex := strings.IndexByte(repl, '%') |
| if strings.HasPrefix(str, patPrefix) && strings.HasSuffix(str, patSuffix) { |
| if replPercentIndex < 0 { |
| return repl |
| } else { |
| return repl[:replPercentIndex] + str[patPercentIndex:len(str)-len(patSuffix)] + repl[replPercentIndex+1:] |
| } |
| } |
| return str |
| } |