1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package match
- import (
- "fmt"
- "strings"
- )
- type PrefixSuffix struct {
- Prefix, Suffix string
- }
- func NewPrefixSuffix(p, s string) PrefixSuffix {
- return PrefixSuffix{p, s}
- }
- func (self PrefixSuffix) Index(s string) (int, []int) {
- prefixIdx := strings.Index(s, self.Prefix)
- if prefixIdx == -1 {
- return -1, nil
- }
- suffixLen := len(self.Suffix)
- if suffixLen <= 0 {
- return prefixIdx, []int{len(s) - prefixIdx}
- }
- if (len(s) - prefixIdx) <= 0 {
- return -1, nil
- }
- segments := acquireSegments(len(s) - prefixIdx)
- for sub := s[prefixIdx:]; ; {
- suffixIdx := strings.LastIndex(sub, self.Suffix)
- if suffixIdx == -1 {
- break
- }
- segments = append(segments, suffixIdx+suffixLen)
- sub = sub[:suffixIdx]
- }
- if len(segments) == 0 {
- releaseSegments(segments)
- return -1, nil
- }
- reverseSegments(segments)
- return prefixIdx, segments
- }
- func (self PrefixSuffix) Len() int {
- return lenNo
- }
- func (self PrefixSuffix) Match(s string) bool {
- return strings.HasPrefix(s, self.Prefix) && strings.HasSuffix(s, self.Suffix)
- }
- func (self PrefixSuffix) String() string {
- return fmt.Sprintf("<prefix_suffix:[%s,%s]>", self.Prefix, self.Suffix)
- }
|