1package match 2 3import ( 4 "fmt" 5 "strings" 6) 7 8type PrefixSuffix struct { 9 Prefix, Suffix string 10} 11 12func NewPrefixSuffix(p, s string) PrefixSuffix { 13 return PrefixSuffix{p, s} 14} 15 16func (self PrefixSuffix) Index(s string) (int, []int) { 17 prefixIdx := strings.Index(s, self.Prefix) 18 if prefixIdx == -1 { 19 return -1, nil 20 } 21 22 suffixLen := len(self.Suffix) 23 if suffixLen <= 0 { 24 return prefixIdx, []int{len(s) - prefixIdx} 25 } 26 27 if (len(s) - prefixIdx) <= 0 { 28 return -1, nil 29 } 30 31 segments := acquireSegments(len(s) - prefixIdx) 32 for sub := s[prefixIdx:]; ; { 33 suffixIdx := strings.LastIndex(sub, self.Suffix) 34 if suffixIdx == -1 { 35 break 36 } 37 38 segments = append(segments, suffixIdx+suffixLen) 39 sub = sub[:suffixIdx] 40 } 41 42 if len(segments) == 0 { 43 releaseSegments(segments) 44 return -1, nil 45 } 46 47 reverseSegments(segments) 48 49 return prefixIdx, segments 50} 51 52func (self PrefixSuffix) Len() int { 53 return lenNo 54} 55 56func (self PrefixSuffix) Match(s string) bool { 57 return strings.HasPrefix(s, self.Prefix) && strings.HasSuffix(s, self.Suffix) 58} 59 60func (self PrefixSuffix) String() string { 61 return fmt.Sprintf("<prefix_suffix:[%s,%s]>", self.Prefix, self.Suffix) 62} 63