1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
}
|