为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕森卡 2023-07-31 17:14:35
我已经尝试在 Go 中使用正则表达式转换 Github 用户名约定有一段时间了,但我无法做到。另外,用户名长度不应超过 39 个字符。以下是来自 Github 的用户名约定用户名只能包含字母数字字符或单个连字符,并且不能以连字符开头或结尾。和长度用户名太长(最多 39 个字符)。这是我写的代码。你可以在Go Playground中查看package mainimport (    "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},但我不知道应该在正则表达式模式中将其添加到哪里。
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

在基于 Go RE2 的正则表达式中,您不能使用环视,因此只能使用另一个正则表达式或常规字符串长度检查来检查长度限制。

完全非正则表达式的方法(演示):

package main


import (

    "fmt"

    "strings"

)

func IsAlnumOrHyphen(s string) bool {

    for _, r := range s {

        if (r < 'a' || r > 'z') && (r < 'A' || r > 'Z') && (r < '0' || r > '9') && r != '-' {

            return false

        }

    }

    return true

}


func main() {

    s := "abc-abc-abc"

    if  len(s) < 40 && len(s) > 0 && !strings.HasPrefix(s, "-") && !strings.Contains(s, "--") && !strings.HasSuffix(s, "-") && IsAlnumOrHyphen(s) {

        fmt.Println("true")

    } else {


        fmt.Println("false")

    }

}

细节

  • len(s) < 40 && len(s) > 0- 长度限制,允许 1 到 39 个字符

  • !strings.HasPrefix(s, "-")- 不应以-

  • !strings.Contains(s, "--")- 不应包含--

  • !strings.HasSuffix(s, "-")- 不应以以下结尾-

  • IsAlnumOrHyphen(s)- 只能包含 ASCII 字母数字和连字符。

对于部分正则表达式方法,请参阅此 Go 演示

package main


import (

    "fmt"

    "regexp"

)


func main() {

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

    re,_ := regexp.Compile(usernameConvention)

    s := "abc-abc-abc"

    if len(s) < 40 && len(s) > 0 && re.MatchString(s) {

        fmt.Println("true")

    } else {


        fmt.Println("false")

    }

}

在这里,^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$正则表达式匹配

  • ^- 字符串的开头

  • [a-zA-Z0-9]+- 1 个或多个 ASCII 字母数字字符

  • (?:-[a-zA-Z0-9]+)*- 0 次或多次重复-,然后是 1 次或更多 ASCII 字母数字字符

  • $- 字符串末尾。


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信