43 lines
1.0 KiB
Go
43 lines
1.0 KiB
Go
package glob
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
var redundantStarRegex = regexp.MustCompile(`\*{2,}`)
|
|
var maybeRedundantQuestionRegex = regexp.MustCompile(`[*?]{2,}`)
|
|
var wildcardRegex = regexp.MustCompile(`[*?]+`)
|
|
|
|
func SplitPattern(pattern string) []string {
|
|
indexes := wildcardRegex.FindAllStringIndex(pattern, -1)
|
|
if len(indexes) == 0 {
|
|
return []string{pattern}
|
|
}
|
|
parts := make([]string, 0, len(indexes)+1)
|
|
start := 0
|
|
for _, part := range indexes {
|
|
end := part[0]
|
|
if end > start {
|
|
parts = append(parts, pattern[start:end])
|
|
}
|
|
parts = append(parts, pattern[part[0]:part[1]])
|
|
start = part[1]
|
|
}
|
|
if start < len(pattern) {
|
|
parts = append(parts, pattern[start:])
|
|
}
|
|
return parts
|
|
}
|
|
|
|
func Simplify(pattern string) string {
|
|
pattern = redundantStarRegex.ReplaceAllString(pattern, "*")
|
|
pattern = maybeRedundantQuestionRegex.ReplaceAllStringFunc(pattern, func(s string) string {
|
|
if !strings.ContainsRune(s, '*') {
|
|
return s
|
|
}
|
|
return strings.Repeat("?", strings.Count(s, "?")) + "*"
|
|
})
|
|
return pattern
|
|
}
|