我正在尝试检查用户名是否只包含字母字符。在Go中检查它的惯用方法是什么?
答案 0 :(得分:31)
您可以使用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'和' A' ..' 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
}
或者如果您的范围有限,例如&#39;一个&#39; ..&#39; Z&#39;和&#39; A&#39; ..&#39; Z&#39;,您可以使用此工作示例代码:
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
}
答案 1 :(得分:4)
以下是我的方式:
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
}
答案 2 :(得分: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)
}
}
答案 3 :(得分:1)
您也可以简洁地执行此操作,而无需导入任何软件包
func isLetter(c rune) bool {
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')
}
func isWord(s string) bool {
for _, c := range s {
if !isLetter(c) {
return false
}
}
return true
}
答案 4 :(得分:0)
一种方法是使用FieldsFunc
from Go's strings
library。
以下内容将用户名中的每个字符与一组unicode字母进行比较。与strings.Split
函数类似,FieldsFunc
将用户名沿不匹配字符(在这种情况下为unicode字母)的边界切成片。下面,我们将原始用户名与切片的连接元素进行比较。
func lettersOnly(username string) bool {
nonLetter := func(c rune) bool { return !unicode.IsLetter(c) }
words := strings.FieldsFunc(username, nonLetter)
return username == strings.Join(words, "")
}
游乐场示例:https://play.golang.org/p/4aWKCu9upox
我们还可以将用户名与非常具体的字符列表进行比较,将strings.FieldsFunc
与strings.ContainsAny
组合在一起。
func hawaiianOnly(username string) bool {
hawaiian := `aeiouhklmnpwʻ`
nonCharacter := func(c rune) bool { return !strings.ContainsAny(hawaiian, strings.ToLower(string(c))) }
words := strings.FieldsFunc(username, nonCharacter)
return username == strings.Join(words, "")
}