133 lines
2.4 KiB
Go
133 lines
2.4 KiB
Go
package stringcase
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
func isLower(ch rune) bool {
|
|
return ch >= 'a' && ch <= 'z'
|
|
}
|
|
|
|
func toLower(ch rune) rune {
|
|
if ch >= 'A' && ch <= 'Z' {
|
|
return ch + 32
|
|
}
|
|
return ch
|
|
}
|
|
|
|
func isUpper(ch rune) bool {
|
|
return ch >= 'A' && ch <= 'Z'
|
|
}
|
|
|
|
func toUpper(ch rune) rune {
|
|
if ch >= 'a' && ch <= 'z' {
|
|
return ch - 32
|
|
}
|
|
return ch
|
|
}
|
|
|
|
func isSpace(ch rune) bool {
|
|
return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r'
|
|
}
|
|
|
|
func isDigit(ch rune) bool {
|
|
return ch >= '0' && ch <= '9'
|
|
}
|
|
|
|
func isDelimiter(ch rune) bool {
|
|
return ch == '-' || ch == '_' || isSpace(ch)
|
|
}
|
|
|
|
type iterFunc func(prev, curr, next rune)
|
|
|
|
func stringIter(s string, callback iterFunc) {
|
|
var prev rune
|
|
var curr rune
|
|
for _, next := range s {
|
|
if curr == 0 {
|
|
prev = curr
|
|
curr = next
|
|
continue
|
|
}
|
|
|
|
callback(prev, curr, next)
|
|
|
|
prev = curr
|
|
curr = next
|
|
}
|
|
|
|
if len(s) > 0 {
|
|
callback(prev, curr, 0)
|
|
}
|
|
}
|
|
|
|
func isAlpha(r rune) bool {
|
|
return (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z')
|
|
}
|
|
|
|
func ReplaceNonAlphanumeric(s string, replacement string) string {
|
|
if replacement == "" {
|
|
replacement = "_"
|
|
}
|
|
// 使用正则表达式匹配非英文字母和数字的字符
|
|
re := regexp.MustCompile("[^a-zA-Z0-9]+")
|
|
// 替换为指定字符
|
|
return re.ReplaceAllString(s, replacement)
|
|
}
|
|
|
|
func SplitByNonAlphanumeric(input string) []string {
|
|
var builder strings.Builder
|
|
for _, r := range input {
|
|
if unicode.IsLetter(r) || unicode.IsDigit(r) {
|
|
builder.WriteRune(r)
|
|
} else {
|
|
builder.WriteRune(' ') // 将非英文字符和数字的字符替换为空格
|
|
}
|
|
}
|
|
processedInput := builder.String()
|
|
return strings.Fields(processedInput) // 使用空格分割字符串
|
|
}
|
|
|
|
func SplitAndKeepDelimiters(input string) []string {
|
|
var result []string
|
|
var builder strings.Builder
|
|
|
|
for _, r := range input {
|
|
if unicode.IsLetter(r) || unicode.IsDigit(r) {
|
|
builder.WriteRune(r)
|
|
} else {
|
|
if builder.Len() > 0 {
|
|
result = append(result, builder.String())
|
|
builder.Reset()
|
|
}
|
|
result = append(result, string(r)) // 保留分隔符
|
|
}
|
|
}
|
|
|
|
if builder.Len() > 0 {
|
|
result = append(result, builder.String())
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
func ContainsFn[T any](slice []T, value T, predicate func(got, want T) bool) bool {
|
|
for _, item := range slice {
|
|
if predicate(item, value) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func isUpperCaseWord(word string) bool {
|
|
for _, r := range word {
|
|
if !unicode.IsUpper(r) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|