github.com/cnotch/ipchub@v1.1.0/utils/scan/scanner.go (about) 1 // Copyright (c) 2019,CAOHONGJU All rights reserved. 2 // Use of this source code is governed by a MIT-style 3 // license that can be found in the LICENSE file. 4 5 package scan 6 7 import ( 8 "strings" 9 "unicode" 10 "unicode/utf8" 11 ) 12 13 // 扫描器 14 var ( 15 // 逗号分割 16 Comma = NewScanner(',', unicode.IsSpace) 17 // 分号分割 18 Semicolon = NewScanner(';', unicode.IsSpace) 19 // 空格分割 20 Space = NewScanner(' ', nil) 21 // 行分割 22 Line = NewScanner('\n', unicode.IsSpace) 23 ) 24 25 // Scanner 扫描器 26 type Scanner struct { 27 delim rune 28 delimLen int 29 trimFunc func(r rune) bool 30 } 31 32 // NewScanner 创建扫描器 33 func NewScanner(delim rune, trimFunc func(r rune) bool) Scanner { 34 scanner := Scanner{ 35 delim: delim, 36 trimFunc: trimFunc, 37 } 38 scanner.delimLen = utf8.RuneLen(delim) 39 if trimFunc == nil { 40 scanner.trimFunc = func(r rune) bool { return false } 41 } 42 return scanner 43 } 44 45 // Scan 扫描字串 46 func (s Scanner) Scan(str string) (advance, token string, continueScan bool) { 47 i := strings.IndexRune(str, s.delim) 48 if i < 0 { 49 return "", strings.TrimFunc(str, s.trimFunc), false 50 } 51 52 return strings.TrimFunc(str[i+s.delimLen:], s.trimFunc), strings.TrimFunc(str[:i], s.trimFunc), true 53 }