Я пытаюсь проверить имя пользователя, содержит ли только буквенные символы. Каков идиоматический способ проверить это в Go?Как проверить, содержит ли строка только буквенные символы в Go?
3
A
ответ
16
вы можете использовать unicode.IsLetter
как этот рабочий пример кода:
package main
import "fmt"
import "unicode"
func IsLetter(s string) bool {
for _, r := range s {
if !unicode.IsLetter(r) {
return false
}
}
return true
}
func main() {
fmt.Println(IsLetter("Alex")) // true
fmt.Println(IsLetter("123")) // false
}
или если вы ограничены в диапазоне, например, «А» .. «Z» и «А» .. «Z», вы можете использовать этот рабочий пример кода:
package main
import "fmt"
func IsLetter(s string) bool {
for _, r := range s {
if (r < 'a' || r > 'z') && (r < 'A' || r > 'Z') {
return false
}
}
return true
}
func main() {
fmt.Println(IsLetter("Alex")) // true
fmt.Println(IsLetter("123 a")) // false
}
или если вы имеете ограниченный диапазон например 'А' .. 'Z' и 'A' .. 'Z', вы можете использовать этот рабочий пример кода:
package main
import "fmt"
import "regexp"
var IsLetter = regexp.MustCompile(`^[a-zA-Z]+$`).MatchString
func main() {
fmt.Println(IsLetter("Alex")) // true
fmt.Println(IsLetter("u123")) // false
}
2
Вот как я это сделать:
import "strings"
const alpha = "abcdefghijklmnopqrstuvwxyz"
func alphaOnly(s string) bool {
for _, char := range s {
if !strings.Contains(alpha, strings.ToLower(string(char))) {
return false
}
}
return true
}
+1
'é' является алфавитным символом. – dolmen
3
Предполагая вы только ищете ASCii письма, вы обычно видите это реализовано в виде регулярного выражения с использованием класса альфа символов [[:alpha:]]
или эквивалентный [A-Za-z]
isAlpha := regexp.MustCompile(`^[A-Za-z]+$`).MatchString
for _, username := range []string{"userone", "user2", "user-three"} {
if !isAlpha(username) {
fmt.Printf("%q is not valid\n", username)
}
}
Есть ли библиотека, которая предоставляет набор функций для проверки строк? – Casper
@CasperLI: назвать несколько: строки, fmt, regexp, strconv, unicode, unicode/utf8, unicode/utf16, путь/путь к файлу, net/url, bytes, bufio, encoding/json, time, ... –
@ CasperLI To (свободно) цитата Роб Пайк: «Немного копировать лучше, чем немного больше зависимости». –