...
1 package match
2
3 import (
4 "fmt"
5 "strings"
6 )
7
8 type PrefixSuffix struct {
9 Prefix, Suffix string
10 }
11
12 func NewPrefixSuffix(p, s string) PrefixSuffix {
13 return PrefixSuffix{p, s}
14 }
15
16 func (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
52 func (self PrefixSuffix) Len() int {
53 return lenNo
54 }
55
56 func (self PrefixSuffix) Match(s string) bool {
57 return strings.HasPrefix(s, self.Prefix) && strings.HasSuffix(s, self.Suffix)
58 }
59
60 func (self PrefixSuffix) String() string {
61 return fmt.Sprintf("<prefix_suffix:[%s,%s]>", self.Prefix, self.Suffix)
62 }
63
View as plain text