diff --git a/internal/namematcher/list.go b/internal/namematcher/list.go index d661e15..312ac17 100644 --- a/internal/namematcher/list.go +++ b/internal/namematcher/list.go @@ -59,14 +59,21 @@ func patternToRe(pattern string) (*regexp.Regexp, error) { buf := []byte(pattern) r.WriteString("(?i)") // make the pattern case insensitive + isFirtRune := true for len(buf) > 0 { buf, b = fetchRune(buf) switch b { + case '/': + if isFirtRune { + r.WriteString(`(^|/)`) + } else { + r.WriteRune('/') + } case '*': - r.WriteString(`[^./]*`) + r.WriteString(`[^/]*`) case '?': - r.WriteString(`[^./]`) + r.WriteString(`[^/]`) case '.', '^', '$', '(', ')', '|': r.WriteRune('\\') r.WriteRune(b) @@ -96,6 +103,7 @@ func patternToRe(pattern string) (*regexp.Regexp, error) { default: r.WriteRune(b) } + isFirtRune = false } if inBrackets { return nil, fmt.Errorf("invalid file name pattern: %s", pattern) diff --git a/internal/namematcher/list_test.go b/internal/namematcher/list_test.go index 9d01d7d..47d5c3c 100644 --- a/internal/namematcher/list_test.go +++ b/internal/namematcher/list_test.go @@ -1,6 +1,8 @@ package namematcher -import "testing" +import ( + "testing" +) func TestList_Match(t *testing.T) { type args struct { @@ -112,14 +114,17 @@ func TestList_Match(t *testing.T) { {"@eaDir/SYNOFILE_THUMB_M_000213.jpg", true}, }, }, + { - name: "._*", + name: "/._*", want: []args{ {"hello.world", false}, {"._hello.world", true}, {"/path/to/file.exe", false}, {"/path/to/._file.exe", true}, {"/path/to/file", false}, + {"/path/to/PXL_20210825_041449609._exported_699_1629864935.jpg", false}, + {"PXL_20210825_041449609._exported_699_1629864935.jpg", false}, }, }, }