1package match 2 3import ( 4 "fmt" 5 "strings" 6) 7 8type Contains struct { 9 Needle string 10 Not bool 11} 12 13func NewContains(needle string, not bool) Contains { 14 return Contains{needle, not} 15} 16 17func (self Contains) Match(s string) bool { 18 return strings.Contains(s, self.Needle) != self.Not 19} 20 21func (self Contains) Index(s string) (int, []int) { 22 var offset int 23 24 idx := strings.Index(s, self.Needle) 25 26 if !self.Not { 27 if idx == -1 { 28 return -1, nil 29 } 30 31 offset = idx + len(self.Needle) 32 if len(s) <= offset { 33 return 0, []int{offset} 34 } 35 s = s[offset:] 36 } else if idx != -1 { 37 s = s[:idx] 38 } 39 40 segments := acquireSegments(len(s) + 1) 41 for i := range s { 42 segments = append(segments, offset+i) 43 } 44 45 return 0, append(segments, offset+len(s)) 46} 47 48func (self Contains) Len() int { 49 return lenNo 50} 51 52func (self Contains) String() string { 53 var not string 54 if self.Not { 55 not = "!" 56 } 57 return fmt.Sprintf("<contains:%s[%s]>", not, self.Needle) 58} 59