Files
go-utils/stringcase/utils.go
2025-06-23 23:26:59 +08:00

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
}