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 字母数字字符$
- 字符串末尾。
- 1 回答
- 0 关注
- 196 浏览
添加回答
举报