我有一个用户名验证器IsValidUsername
,我正在测试“baconman”,但它失败了,有人可以帮我解决这个正则表达式吗?
if(!Regex.IsMatch(str, @"^[a-zA-Z]\\w+|[0-9][0-9_]*[a-zA-Z]+\\w*$")) {
isValid = false;
}
我希望限制是:(非常接近)
- 长度在 5 到 17 个字符之间
- 至少包含一个字母
- 没有空间
- 没有特殊字符
我有一个用户名验证器IsValidUsername
,我正在测试“baconman”,但它失败了,有人可以帮我解决这个正则表达式吗?
if(!Regex.IsMatch(str, @"^[a-zA-Z]\\w+|[0-9][0-9_]*[a-zA-Z]+\\w*$")) {
isValid = false;
}
我希望限制是:(非常接近)
您正在不必要地转义:如果您将正则表达式编写为在字符串之外以 @ 开头,则不需要两个 \ - 一个就可以了。
任何一个:
@"\w"
或者
"\\w"
编辑:我没有说清楚:现在由于双重转义,您正在寻找正则表达式中的 \ 和 w。所以你的比赛需要 [some character]\w 来匹配(例如:“a\w”或“a\wwwwww”将匹配。
您的要求最好在普通 C# 中得到满足。它们不能很好地映射到正则表达式。只需使用 LINQ 对它们进行编码,它可以像在IEnumerable<char>
.
此外,理解字符串的查询比理解符合您要求的正则表达式要容易得多。
作为正则表达式的一部分,可以做所有事情,但是它并不漂亮:-)
^(\w(?=\w*[a-zA-Z])|[a-zA-Z]|\w(?<=[a-zA-Z]\w*)){5,17}$
它做了 3 次检查,总是导致 1 个字符被匹配(所以我们可以在最后执行长度检查)