322 lines
7.4 KiB
Go
322 lines
7.4 KiB
Go
package stream
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// NewString 创建字符串流
|
|
func NewString[S ~string](s S) *String[S] {
|
|
return &String[S]{s}
|
|
}
|
|
|
|
// String 字符串流
|
|
type String[S ~string] struct {
|
|
str S
|
|
}
|
|
|
|
// Elem 返回字符串
|
|
func (s *String[S]) Elem() S {
|
|
return s.str
|
|
}
|
|
|
|
// String 返回字符串
|
|
func (s *String[S]) String() string {
|
|
return string(s.str)
|
|
}
|
|
|
|
// Index 返回字符串指定位置的字符,当索引超出范围时将会触发 panic
|
|
func (s *String[S]) Index(i int) *String[S] {
|
|
return NewString(S(s.str[i]))
|
|
}
|
|
|
|
// Range 返回字符串指定范围的字符
|
|
func (s *String[S]) Range(start, end int) *String[S] {
|
|
return NewString(s.str[start:end])
|
|
}
|
|
|
|
// TrimSpace 返回去除字符串首尾空白字符的字符串
|
|
func (s *String[S]) TrimSpace() *String[S] {
|
|
return NewString(S(strings.TrimSpace(string(s.str))))
|
|
}
|
|
|
|
// Trim 返回去除字符串首尾指定字符的字符串
|
|
func (s *String[S]) Trim(cs string) *String[S] {
|
|
return NewString(S(strings.Trim(string(s.str), cs)))
|
|
}
|
|
|
|
// TrimPrefix 返回去除字符串前缀的字符串
|
|
func (s *String[S]) TrimPrefix(prefix string) *String[S] {
|
|
return NewString(S(strings.TrimPrefix(string(s.str), prefix)))
|
|
}
|
|
|
|
// TrimSuffix 返回去除字符串后缀的字符串
|
|
func (s *String[S]) TrimSuffix(suffix string) *String[S] {
|
|
return NewString(S(strings.TrimSuffix(string(s.str), suffix)))
|
|
}
|
|
|
|
// ToUpper 返回字符串的大写形式
|
|
func (s *String[S]) ToUpper() *String[S] {
|
|
return NewString(S(strings.ToUpper(string(s.str))))
|
|
}
|
|
|
|
// ToLower 返回字符串的小写形式
|
|
func (s *String[S]) ToLower() *String[S] {
|
|
return NewString(S(strings.ToLower(string(s.str))))
|
|
}
|
|
|
|
// Equal 返回字符串是否相等
|
|
func (s *String[S]) Equal(ss S) bool {
|
|
return s.str == ss
|
|
}
|
|
|
|
// HasPrefix 返回字符串是否包含指定前缀
|
|
func (s *String[S]) HasPrefix(prefix S) bool {
|
|
return strings.HasPrefix(string(s.str), string(prefix))
|
|
}
|
|
|
|
// HasSuffix 返回字符串是否包含指定后缀
|
|
func (s *String[S]) HasSuffix(suffix S) bool {
|
|
return strings.HasSuffix(string(s.str), string(suffix))
|
|
}
|
|
|
|
// Len 返回字符串长度
|
|
func (s *String[S]) Len() int {
|
|
return len(s.str)
|
|
}
|
|
|
|
// Contains 返回字符串是否包含指定子串
|
|
func (s *String[S]) Contains(sub S) bool {
|
|
return strings.Contains(string(s.str), string(sub))
|
|
}
|
|
|
|
// Count 返回字符串包含指定子串的次数
|
|
func (s *String[S]) Count(sub S) int {
|
|
return strings.Count(string(s.str), string(sub))
|
|
}
|
|
|
|
// Repeat 返回重复 count 次的字符串
|
|
func (s *String[S]) Repeat(count int) *String[S] {
|
|
return NewString(S(strings.Repeat(string(s.str), count)))
|
|
}
|
|
|
|
// Replace 返回替换指定子串后的字符串
|
|
func (s *String[S]) Replace(old, new S, n int) *String[S] {
|
|
return NewString(S(strings.Replace(string(s.str), string(old), string(new), n)))
|
|
}
|
|
|
|
// ReplaceAll 返回替换所有指定子串后的字符串
|
|
func (s *String[S]) ReplaceAll(old, new S) *String[S] {
|
|
return NewString(S(strings.ReplaceAll(string(s.str), string(old), string(new))))
|
|
}
|
|
|
|
// Append 返回追加指定字符串后的字符串
|
|
func (s *String[S]) Append(ss S) *String[S] {
|
|
return NewString(S(string(s.str) + string(ss)))
|
|
}
|
|
|
|
// Prepend 返回追加指定字符串后的字符串,追加的字符串在前
|
|
func (s *String[S]) Prepend(ss S) *String[S] {
|
|
return NewString(S(string(ss) + string(s.str)))
|
|
}
|
|
|
|
// Clear 返回清空字符串后的字符串
|
|
func (s *String[S]) Clear() *String[S] {
|
|
return NewString(S(""))
|
|
}
|
|
|
|
// Reverse 返回反转字符串后的字符串
|
|
func (s *String[S]) Reverse() *String[S] {
|
|
var str = []rune(string(s.str))
|
|
for i, j := 0, len(str)-1; i < j; i, j = i+1, j-1 {
|
|
str[i], str[j] = str[j], str[i]
|
|
}
|
|
return NewString(S(string(str)))
|
|
}
|
|
|
|
// Queto 返回带引号的字符串
|
|
func (s *String[S]) Queto() *String[S] {
|
|
return NewString(S(strconv.Quote(string(s.str))))
|
|
}
|
|
|
|
// QuetoToASCII 返回带引号的字符串
|
|
func (s *String[S]) QuetoToASCII() *String[S] {
|
|
return NewString(S(strconv.QuoteToASCII(string(s.str))))
|
|
}
|
|
|
|
// FirstUpper 返回首字母大写的字符串
|
|
func (s *String[S]) FirstUpper() *String[S] {
|
|
var upperStr string
|
|
vv := []rune(string(s.str))
|
|
for i := 0; i < len(vv); i++ {
|
|
if i == 0 {
|
|
if vv[i] >= 97 && vv[i] <= 122 {
|
|
vv[i] -= 32
|
|
upperStr += string(vv[i])
|
|
} else {
|
|
return s
|
|
}
|
|
} else {
|
|
upperStr += string(vv[i])
|
|
}
|
|
}
|
|
return NewString(S(upperStr))
|
|
}
|
|
|
|
// FirstLower 返回首字母小写的字符串
|
|
func (s *String[S]) FirstLower() *String[S] {
|
|
var lowerStr string
|
|
vv := []rune(string(s.str))
|
|
for i := 0; i < len(vv); i++ {
|
|
if i == 0 {
|
|
if vv[i] >= 65 && vv[i] <= 90 {
|
|
vv[i] += 32
|
|
lowerStr += string(vv[i])
|
|
} else {
|
|
return s
|
|
}
|
|
} else {
|
|
lowerStr += string(vv[i])
|
|
}
|
|
}
|
|
return NewString(S(lowerStr))
|
|
}
|
|
|
|
// SnakeCase 返回蛇形命名的字符串
|
|
func (s *String[S]) SnakeCase() *String[S] {
|
|
var str = string(s.str)
|
|
var result string
|
|
for i, v := range str {
|
|
if v >= 65 && v <= 90 {
|
|
if i != 0 {
|
|
result += "_"
|
|
}
|
|
result += string(v + 32)
|
|
} else {
|
|
result += string(v)
|
|
}
|
|
}
|
|
return NewString(S(result))
|
|
}
|
|
|
|
// CamelCase 返回驼峰命名的字符串
|
|
func (s *String[S]) CamelCase() *String[S] {
|
|
var str = string(s.str)
|
|
var result string
|
|
var upper = false
|
|
for _, v := range str {
|
|
if v == 95 {
|
|
upper = true
|
|
} else {
|
|
if upper {
|
|
result += string(v - 32)
|
|
upper = false
|
|
} else {
|
|
result += string(v)
|
|
}
|
|
}
|
|
}
|
|
return NewString(S(result))
|
|
}
|
|
|
|
// KebabCase 返回短横线命名的字符串
|
|
func (s *String[S]) KebabCase() *String[S] {
|
|
var str = string(s.str)
|
|
var result string
|
|
for i, v := range str {
|
|
if v >= 65 && v <= 90 {
|
|
if i != 0 {
|
|
result += "-"
|
|
}
|
|
result += string(v + 32)
|
|
} else {
|
|
result += string(v)
|
|
}
|
|
}
|
|
return NewString(S(result))
|
|
}
|
|
|
|
// TitleCase 返回标题命名的字符串
|
|
func (s *String[S]) TitleCase() *String[S] {
|
|
var str = string(s.str)
|
|
var result string
|
|
var upper = true
|
|
for _, v := range str {
|
|
if v == 95 || v == 45 || v == 32 {
|
|
upper = true
|
|
} else {
|
|
if upper {
|
|
result += string(v - 32)
|
|
upper = false
|
|
} else {
|
|
result += string(v)
|
|
}
|
|
}
|
|
}
|
|
return NewString(S(result))
|
|
}
|
|
|
|
// Bytes 返回字符串的字节数组
|
|
func (s *String[S]) Bytes() []byte {
|
|
return []byte(s.str)
|
|
}
|
|
|
|
// Runes 返回字符串的字符数组
|
|
func (s *String[S]) Runes() []rune {
|
|
return []rune(s.str)
|
|
}
|
|
|
|
// Default 当字符串为空时设置默认值
|
|
func (s *String[S]) Default(def S) *String[S] {
|
|
if s.str == "" {
|
|
return NewString(def)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// Handle 处理字符串
|
|
func (s *String[S]) Handle(f func(S)) *String[S] {
|
|
f(s.str)
|
|
return s
|
|
}
|
|
|
|
// Update 更新字符串
|
|
func (s *String[S]) Update(f func(S) S) *String[S] {
|
|
s.str = f(s.str)
|
|
return s
|
|
}
|
|
|
|
// Split 返回字符串切片
|
|
func (s *String[S]) Split(sep string) Strings[S] {
|
|
slice := strings.Split(string(s.str), sep)
|
|
rep := make([]S, len(slice))
|
|
for i, v := range slice {
|
|
rep[i] = S(v)
|
|
}
|
|
return NewStrings(rep...)
|
|
}
|
|
|
|
// SplitN 返回字符串切片
|
|
func (s *String[S]) SplitN(sep string, n int) Strings[S] {
|
|
slice := strings.SplitN(string(s.str), sep, n)
|
|
rep := make([]S, len(slice))
|
|
for i, v := range slice {
|
|
rep[i] = S(v)
|
|
}
|
|
return NewStrings(rep...)
|
|
}
|
|
|
|
// Batched 将字符串按照指定长度分组,最后一组可能小于指定长度
|
|
func (s *String[S]) Batched(size int) Strings[S] {
|
|
var str = string(s.str)
|
|
var result = make([]S, 0, len(str)/size+1)
|
|
for len(str) >= size {
|
|
result = append(result, S(str[:size]))
|
|
str = str[size:]
|
|
}
|
|
if len(str) > 0 {
|
|
result = append(result, S(str))
|
|
}
|
|
return NewStrings(result...)
|
|
}
|