0

我有一个用户名验证器IsValidUsername,我正在测试“baconman”,但它失败了,有人可以帮我解决这个正则表达式吗?

if(!Regex.IsMatch(str, @"^[a-zA-Z]\\w+|[0-9][0-9_]*[a-zA-Z]+\\w*$")) {
    isValid = false;
}

我希望限制是:(非常接近)

  1. 长度在 5 到 17 个字符之间
  2. 至少包含一个字母
  3. 没有空间
  4. 没有特殊字符
4

3 回答 3

2

您正在不必要地转义:如果您将正则表达式编写为在字符串之外以 @ 开头,则不需要两个 \ - 一个就可以了。

任何一个:

@"\w"

或者

"\\w"

编辑:我没有说清楚:现在由于双重转义,您正在寻找正则表达式中的 \ 和 w。所以你的比赛需要 [some character]\w 来匹配(例如:“a\w”或“a\wwwwww”将匹配。

于 2013-02-20T20:02:38.003 回答
1

您的要求最好在普通 C# 中得到满足。它们不能很好地映射到正则表达式。只需使用 LINQ 对它们进行编码,它可以像在IEnumerable<char>.

此外,理解字符串的查询比理解符合您要求的正则表达式要容易得多。

于 2013-02-20T20:10:04.180 回答
0

作为正则表达式的一部分,可以做所有事情,但是它并不漂亮:-)

^(\w(?=\w*[a-zA-Z])|[a-zA-Z]|\w(?<=[a-zA-Z]\w*)){5,17}$

它做了 3 次检查,总是导致 1 个字符被匹配(所以我们可以在最后执行长度检查)

  1. 该字符是 [a-zA-Z] 之前的任何单词字符 \w
  2. 或者它是 [a-zA-Z]
  3. 或者它是 [a-zA-Z] 之后的任何单词字符 \w
于 2013-02-21T08:53:39.707 回答