package contentstats import ( "regexp" "strings" "unicode" ) var latinTokenPattern = regexp.MustCompile(`[A-Za-z0-9]+(?:['’-][A-Za-z0-9]+)?`) func CountWords(input string) int { input = strings.TrimSpace(input) if input == "" { return 0 } var builder strings.Builder hanCount := 0 for _, r := range input { switch { case unicode.Is(unicode.Han, r): hanCount++ builder.WriteRune(' ') case unicode.IsLetter(r) || unicode.IsDigit(r): builder.WriteRune(r) case unicode.IsSpace(r): builder.WriteRune(' ') default: builder.WriteRune(' ') } } latinCount := len(latinTokenPattern.FindAllString(builder.String(), -1)) return hanCount + latinCount }