Go 如何检查字符串中是否只包含字母字符?

Go 如何检查字符串中是否只包含字母字符?,go,Go,我试图检查用户名是否只包含字母字符。在Go中检查它的惯用方法是什么?您可以使用unicode.isleter如以下示例代码: package main import "fmt" import "unicode" func IsLetter(s string) bool { for _, r := range s { if !unicode.IsLetter(r) { return false } } return

我试图检查用户名是否只包含字母字符。在Go中检查它的惯用方法是什么?

您可以使用unicode.isleter如以下示例代码:

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
}
或者,如果您的范围有限,例如“a”…'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

}
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
}

我会这样做:

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
}

假设您只查找ascii字母,您通常会看到它是使用alpha字符类
[[: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)
    }
}

您也可以在不导入任何包的情况下简洁地执行此操作

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
}
func-isleter(c符文)bool{
return('a'一种方法是使用

下面将用户名中的每个字符与unicode字母集进行比较。与
字符串.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, "")
}
游乐场示例:

我们还可以将用户名与非常特定的字符列表进行比较,将
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, "")
}

操场示例:

是否有一个库提供一组函数来进行字符串检查?@CasperLI:举几个例子:字符串、fmt、regexp、strconv、unicode、unicode/utf8、unicode/utf16、path/filepath、net/url、bytes、bufio、encoding/json、time、@CasperLI(自由)引用Rob Pike:“一点复制比一点依赖要好”。为什么在标准库或github上没有字符串检查函数集合,这样我们就可以在一行中直接调用这些函数?知道一个字符可以通过常规类型转换
unicode.isleter(rune('A')转换为符文也很有用
是一个字母字符。