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  }