Files
trojanZ/trojan-master/util/string.go
T
2026-07-26 00:09:57 +08:00

169 lines
3.5 KiB
Go

package util
import (
"fmt"
"github.com/eiannone/keyboard"
"math/rand"
"reflect"
"regexp"
"strconv"
"time"
)
const (
// RED 红色
RED = "\033[31m"
// GREEN 绿色
GREEN = "\033[32m"
// YELLOW 黄色
YELLOW = "\033[33m"
// BLUE 蓝色
BLUE = "\033[34m"
// FUCHSIA 紫红色
FUCHSIA = "\033[35m"
// CYAN 青色
CYAN = "\033[36m"
// WHITE 白色
WHITE = "\033[37m"
// RESET 重置颜色
RESET = "\033[0m"
// LETTER 大小写英文字母常量
LETTER = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
// DIGITS 数字常量
DIGITS = "0123456789"
// SPECIALS 特殊字符常量
SPECIALS = "~=+%^*/()[]{}/!@#$?|"
// ALL 全部字符常量
ALL = LETTER + DIGITS + SPECIALS
)
// IsInteger 判断字符串是否为整数
func IsInteger(input string) bool {
_, err := strconv.Atoi(input)
return err == nil
}
// RandString 随机字符串
func RandString(length int, source string) string {
var runes = []rune(source)
b := make([]rune, length)
rand.New(rand.NewSource(time.Now().UnixNano()))
for i := range b {
b[i] = runes[rand.Intn(len(runes))]
}
return string(b)
}
// VerifyEmailFormat 邮箱验证
func VerifyEmailFormat(email string) bool {
pattern := `^[0-9a-z][_.0-9a-z-]{0,31}@([0-9a-z][0-9a-z-]{0,30}[0-9a-z]\.){1,4}[a-z]{2,4}$`
reg := regexp.MustCompile(pattern)
return reg.MatchString(email)
}
func getChar(str string) string {
err := keyboard.Open()
if err != nil {
panic(err)
}
defer keyboard.Close()
fmt.Print(str)
char, _, _ := keyboard.GetKey()
fmt.Printf("%c\n", char)
if char == 0 {
return ""
}
return string(char)
}
// LoopInput 循环输入选择, 或者直接回车退出
func LoopInput(tip string, choices interface{}, singleRowPrint bool) int {
reflectValue := reflect.ValueOf(choices)
if reflectValue.Kind() != reflect.Slice && reflectValue.Kind() != reflect.Array {
fmt.Println("only support slice or array type!")
return -1
}
length := reflectValue.Len()
if reflectValue.Type().String() == "[]string" {
if singleRowPrint {
for i := 0; i < length; i++ {
fmt.Printf("%d.%s\n\n", i+1, reflectValue.Index(i).Interface())
}
} else {
for i := 0; i < length; i++ {
if i%2 == 0 {
fmt.Printf("%d.%-15s\t", i+1, reflectValue.Index(i).Interface())
} else {
fmt.Printf("%d.%-15s\n\n", i+1, reflectValue.Index(i).Interface())
}
}
}
}
for {
inputString := ""
if length < 10 {
inputString = getChar(tip)
} else {
fmt.Print(tip)
_, _ = fmt.Scanln(&inputString)
}
if inputString == "" {
return -1
} else if !IsInteger(inputString) {
fmt.Println("输入有误,请重新输入")
continue
}
number, _ := strconv.Atoi(inputString)
if number <= length && number > 0 {
return number
}
fmt.Println("输入数字越界,请重新输入")
}
}
// Input 读取终端用户输入
func Input(tip string, defaultValue string) string {
input := ""
fmt.Print(tip)
_, _ = fmt.Scanln(&input)
if input == "" && defaultValue != "" {
input = defaultValue
}
return input
}
// Red 红色
func Red(str string) string {
return RED + str + RESET
}
// Green 绿色
func Green(str string) string {
return GREEN + str + RESET
}
// Yellow 黄色
func Yellow(str string) string {
return YELLOW + str + RESET
}
// Blue 蓝色
func Blue(str string) string {
return BLUE + str + RESET
}
// Fuchsia 紫红色
func Fuchsia(str string) string {
return FUCHSIA + str + RESET
}
// Cyan 青色
func Cyan(str string) string {
return CYAN + str + RESET
}
// White 白色
func White(str string) string {
return WHITE + str + RESET
}