From 6a67712944bbba3bfbb04e6ad02f7ae7d55cd238 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 13 Aug 2024 11:19:54 +0900 Subject: Implement exact-boundary match type Close #3963 --- src/pattern.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/pattern.go') diff --git a/src/pattern.go b/src/pattern.go index ee1b88a5..c736be3c 100644 --- a/src/pattern.go +++ b/src/pattern.go @@ -23,6 +23,7 @@ type termType int const ( termFuzzy termType = iota termExact + termExactBoundary termPrefix termSuffix termEqual @@ -147,6 +148,7 @@ func BuildPattern(cache *ChunkCache, patternCache map[string]*Pattern, fuzzy boo ptr.procFun[termFuzzy] = fuzzyAlgo ptr.procFun[termEqual] = algo.EqualMatch ptr.procFun[termExact] = algo.ExactMatchNaive + ptr.procFun[termExactBoundary] = algo.ExactMatchBoundary ptr.procFun[termPrefix] = algo.PrefixMatch ptr.procFun[termSuffix] = algo.SuffixMatch @@ -193,7 +195,14 @@ func parseTerms(fuzzy bool, caseMode Case, normalize bool, str string) []termSet text = text[:len(text)-1] } - if strings.HasPrefix(text, "'") { + if fuzzy && len(text) > 2 && strings.HasPrefix(text, "'") && strings.HasSuffix(text, "'") || + !fuzzy && !strings.HasPrefix(text, "'") && strings.HasSuffix(text, "'") { + typ = termExactBoundary + if fuzzy { + text = text[1:] + } + text = text[:len(text)-1] + } else if strings.HasPrefix(text, "'") { // Flip exactness if fuzzy && !inv { typ = termExact -- cgit v1.2.3