forked from aws/aws-xray-sdk-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
search_pattern.go
97 lines (86 loc) · 2.47 KB
/
search_pattern.go
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// Copyright 2017-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. A copy of the License is located at
//
// https://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
// Package pattern provides a basic pattern matching utility.
// Patterns may contain fixed text, and/or special characters (`*`, `?`).
// `*` represents 0 or more wildcard characters. `?` represents a single wildcard character.
package pattern
import "strings"
// WildcardMatchCaseInsensitive returns true if text matches pattern (case-insensitive); returns false otherwise.
func WildcardMatchCaseInsensitive(pattern string, text string) bool {
return WildcardMatch(pattern, text, true)
}
// WildcardMatch returns true if text matches pattern at the given case-sensitivity; returns false otherwise.
func WildcardMatch(pattern string, text string, caseInsensitive bool) bool {
patternLen := len(pattern)
textLen := len(text)
if 0 == patternLen {
return 0 == textLen
}
if isWildcardGlob(pattern) {
return true
}
if caseInsensitive {
pattern = strings.ToLower(pattern)
text = strings.ToLower(text)
}
indexOfGlob := strings.Index(pattern, "*")
if -1 == indexOfGlob || patternLen-1 == indexOfGlob {
return simpleWildcardMatch(pattern, text)
}
res := make([]bool, textLen+1)
res[0] = true
for j := 0; j < patternLen; j++ {
p := pattern[j]
if '*' != p {
for i := textLen - 1; i >= 0; i-- {
t := text[i]
res[i+1] = res[i] && ('?' == p || t == p)
}
} else {
i := 0
for i <= textLen && !res[i] {
i++
}
for i <= textLen {
res[i] = true
i++
}
}
res[0] = res[0] && '*' == p
}
return res[textLen]
}
func simpleWildcardMatch(pattern string, text string) bool {
j := 0
patternLen := len(pattern)
textLen := len(text)
for i := 0; i < patternLen; i++ {
p := pattern[i]
if '*' == p {
return true
} else if '?' == p {
if textLen == j {
return false
}
j++
} else {
if j >= textLen {
return false
}
t := text[j]
if p != t {
return false
}
j++
}
}
return j == textLen
}
func isWildcardGlob(pattern string) bool {
return pattern == "*"
}