diff options
author | Emile <git@emile.space> | 2024-10-25 15:55:50 +0200 |
---|---|---|
committer | Emile <git@emile.space> | 2024-10-25 15:55:50 +0200 |
commit | c90f36e3dd179d2de96f4f5fe38d8dc9a9de6dfe (patch) | |
tree | 89e9afb41c5bf76f48cfb09305a2d3db8d302b06 /vendor/go.mau.fi/util/glob/regex.go | |
parent | 98bbb0f559a8883bc47bae80607dbe326a448e61 (diff) |
Diffstat (limited to 'vendor/go.mau.fi/util/glob/regex.go')
-rw-r--r-- | vendor/go.mau.fi/util/glob/regex.go | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/vendor/go.mau.fi/util/glob/regex.go b/vendor/go.mau.fi/util/glob/regex.go new file mode 100644 index 0000000..f224533 --- /dev/null +++ b/vendor/go.mau.fi/util/glob/regex.go @@ -0,0 +1,43 @@ +package glob + +import ( + "fmt" + "regexp" + "strings" +) + +type RegexGlob struct { + regex *regexp.Regexp +} + +func (rg *RegexGlob) Match(s string) bool { + return rg.regex.MatchString(s) +} + +func CompileRegex(pattern string) (*RegexGlob, error) { + var buf strings.Builder + buf.WriteRune('^') + for _, part := range SplitPattern(pattern) { + if strings.ContainsRune(part, '*') || strings.ContainsRune(part, '?') { + questions := strings.Count(part, "?") + star := strings.ContainsRune(part, '*') + if star { + if questions > 0 { + _, _ = fmt.Fprintf(&buf, ".{%d,}", questions) + } else { + buf.WriteString(".*") + } + } else if questions > 0 { + _, _ = fmt.Fprintf(&buf, ".{%d}", questions) + } + } else { + buf.WriteString(regexp.QuoteMeta(part)) + } + } + buf.WriteRune('$') + regex, err := regexp.Compile(buf.String()) + if err != nil { + return nil, err + } + return &RegexGlob{regex}, nil +} |