mirror of
https://github.com/jeremyd/ergo.git
synced 2026-07-28 01:38:10 -07:00
fix #1003
This commit is contained in:
+38
-6
@@ -11,21 +11,53 @@ import (
|
||||
|
||||
// yet another glob implementation in Go
|
||||
|
||||
func CompileGlob(glob string) (result *regexp.Regexp, err error) {
|
||||
var buf bytes.Buffer
|
||||
buf.WriteByte('^')
|
||||
func addRegexp(buf *bytes.Buffer, glob string, submatch bool) (err error) {
|
||||
for _, r := range glob {
|
||||
switch r {
|
||||
case '*':
|
||||
buf.WriteString("(.*)")
|
||||
if submatch {
|
||||
buf.WriteString("(.*)")
|
||||
} else {
|
||||
buf.WriteString(".*")
|
||||
}
|
||||
case '?':
|
||||
buf.WriteString("(.)")
|
||||
if submatch {
|
||||
buf.WriteString("(.)")
|
||||
} else {
|
||||
buf.WriteString(".")
|
||||
}
|
||||
case 0xFFFD:
|
||||
return nil, &syntax.Error{Code: syntax.ErrInvalidUTF8, Expr: glob}
|
||||
return &syntax.Error{Code: syntax.ErrInvalidUTF8, Expr: glob}
|
||||
default:
|
||||
buf.WriteString(regexp.QuoteMeta(string(r)))
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func CompileGlob(glob string, submatch bool) (result *regexp.Regexp, err error) {
|
||||
var buf bytes.Buffer
|
||||
buf.WriteByte('^')
|
||||
err = addRegexp(&buf, glob, submatch)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
buf.WriteByte('$')
|
||||
return regexp.Compile(buf.String())
|
||||
}
|
||||
|
||||
func CompileMasks(masks []string) (result *regexp.Regexp, err error) {
|
||||
var buf bytes.Buffer
|
||||
buf.WriteString("^(")
|
||||
for i, mask := range masks {
|
||||
err = addRegexp(&buf, mask, false)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if i != len(masks)-1 {
|
||||
buf.WriteByte('|')
|
||||
}
|
||||
}
|
||||
buf.WriteString(")$")
|
||||
return regexp.Compile(buf.String())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user