猿问

使用正则表达式的 Github 用户名约定

我已经尝试在 Go 中使用正则表达式转换 Github 用户名约定有一段时间了,但我无法做到。另外,用户名长度不应超过 39 个字符

以下是来自 Github 的用户名约定

用户名只能包含字母数字字符或单个连字符,并且不能以连字符开头或结尾。

和长度

用户名太长(最多 39 个字符)。

这是我写的代码。你可以在Go Playground中查看

package main


import (

    "fmt"

    "regexp"

)


func main() {

    usernameConvention := "^[a-zA-Z0-9]*[-]?[a-zA-Z0-9]*$"


    if re, _ := regexp.Compile(usernameConvention); !re.MatchString("abc-abc") {

        fmt.Println("false")

    } else {

        fmt.Println("true")

    }

}


目前,我可以实现这些:


a-b // true - Working!

-ab // false - Working!

ab- // false - Working!

0-0 // true - Working!

但我面临的问题是我找不到适用于以下场景的正则表达式模式:


a-b-c // false - Should be true

此外,它必须在 39 个字符以内,我发现我们可以使用{1,38},但我不知道应该在正则表达式模式中将其添加到哪里。


慕森卡
浏览 188回答 1
1回答

繁星淼淼

在基于 Go RE2 的正则表达式中,您不能使用环视,因此只能使用另一个正则表达式或常规字符串长度检查来检查长度限制。完全非正则表达式的方法(演示):package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "strings")func IsAlnumOrHyphen(s string) bool {&nbsp; &nbsp; for _, r := range s {&nbsp; &nbsp; &nbsp; &nbsp; if (r < 'a' || r > 'z') && (r < 'A' || r > 'Z') && (r < '0' || r > '9') && r != '-' {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return true}func main() {&nbsp; &nbsp; s := "abc-abc-abc"&nbsp; &nbsp; if&nbsp; len(s) < 40 && len(s) > 0 && !strings.HasPrefix(s, "-") && !strings.Contains(s, "--") && !strings.HasSuffix(s, "-") && IsAlnumOrHyphen(s) {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("true")&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("false")&nbsp; &nbsp; }}细节len(s) < 40 && len(s) > 0- 长度限制,允许 1 到 39 个字符!strings.HasPrefix(s, "-")- 不应以-!strings.Contains(s, "--")- 不应包含--!strings.HasSuffix(s, "-")- 不应以以下结尾-IsAlnumOrHyphen(s)- 只能包含 ASCII 字母数字和连字符。对于部分正则表达式方法,请参阅此 Go 演示:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "regexp")func main() {&nbsp; &nbsp; usernameConvention := "^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$"&nbsp; &nbsp; re,_ := regexp.Compile(usernameConvention)&nbsp; &nbsp; s := "abc-abc-abc"&nbsp; &nbsp; if len(s) < 40 && len(s) > 0 && re.MatchString(s) {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("true")&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("false")&nbsp; &nbsp; }}在这里,^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$正则表达式匹配^- 字符串的开头[a-zA-Z0-9]+- 1 个或多个 ASCII 字母数字字符(?:-[a-zA-Z0-9]+)*- 0 次或多次重复-,然后是 1 次或更多 ASCII 字母数字字符$- 字符串末尾。
随时随地看视频慕课网APP

相关分类

Go
我要回答