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

问题描述 投票:0回答:6

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

go
6个回答
111
投票

您可以使用 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
}

或者从 go1.21 开始:

package main

import (
    "fmt"
    "strings"
    "unicode"
)

func IsLetter(s string) bool {
    return !strings.ContainsFunc(s, func(r rune) bool {
        return !unicode.IsLetter(r)
    })
}

func main() {
    fmt.Println(IsLetter("Alex"))  // true
    fmt.Println(IsLetter("123 a")) // 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

}

或者从 go1.21 开始:

package main

import (
    "fmt"
    "strings"
    "unicode"
)

func IsLetter(s string) bool {
    return !strings.ContainsFunc(s, func(r rune) bool {
        return (r < 'a' || r > 'z') && (r < 'A' || r > 'Z')
    })
}

func main() {
    fmt.Println(IsLetter("Alex"))  // true
    fmt.Println(IsLetter("123 a")) // false

}

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

13
投票

假设您只查找 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)
    }
}

https://play.golang.org/p/lT9Fki7tt7


10
投票

这是我的做法:

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
}

6
投票

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

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
}

1
投票

一种方法是使用 Go 的 FieldsFunc

中的
strings

下面将用户名中的每个字符与 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, "")
}

游乐场示例:https://play.golang.org/p/ipwAOC3c72P


0
投票
package main

import (
    "fmt"
    "strings"
    "unicode"
)

func isLetter(c rune) bool {
    return !unicode.IsLetter(c)
}
func main() {
    fmt.Printf(" desired word : %s\n", strings.TrimFunc("12333", isLetter)) //ignored it
    fmt.Printf(" desired word : %s\n", strings.TrimFunc("abcd", isLetter))  //take  it

}
© www.soinside.com 2019 - 2024. All rights reserved.