func WildcardMatch()

in pattern/search_pattern.go [22:74]


func WildcardMatch(pattern, text string, caseInsensitive bool) bool {
	patternLen := len(pattern)
	textLen := len(text)
	if patternLen == 0 {
		return textLen == 0
	}

	if pattern == "*" {
		return true
	}

	if caseInsensitive {
		pattern = strings.ToLower(pattern)
		text = strings.ToLower(text)
	}

	i := 0
	p := 0
	iStar := textLen
	pStar := 0

	for i < textLen {
		if p < patternLen {
			switch pattern[p] {
			case text[i]:
				i++
				p++
				continue
			case '?':
				i++
				p++
				continue
			case '*':
				iStar = i
				pStar = p
				p++
				continue
			}
		}
		if iStar == textLen {
			return false
		}
		iStar++
		i = iStar
		p = pStar + 1
	}

	for p < patternLen && pattern[p] == '*' {
		p++
	}

	return p == patternLen && i == textLen
}