1package match 2 3import ( 4 "fmt" 5 "unicode/utf8" 6) 7 8type Range struct { 9 Lo, Hi rune 10 Not bool 11} 12 13func NewRange(lo, hi rune, not bool) Range { 14 return Range{lo, hi, not} 15} 16 17func (self Range) Len() int { 18 return lenOne 19} 20 21func (self Range) Match(s string) bool { 22 r, w := utf8.DecodeRuneInString(s) 23 if len(s) > w { 24 return false 25 } 26 27 inRange := r >= self.Lo && r <= self.Hi 28 29 return inRange == !self.Not 30} 31 32func (self Range) Index(s string) (int, []int) { 33 for i, r := range s { 34 if self.Not != (r >= self.Lo && r <= self.Hi) { 35 return i, segmentsByRuneLength[utf8.RuneLen(r)] 36 } 37 } 38 39 return -1, nil 40} 41 42func (self Range) String() string { 43 var not string 44 if self.Not { 45 not = "!" 46 } 47 return fmt.Sprintf("<range:%s[%s,%s]>", not, string(self.Lo), string(self.Hi)) 48} 49