为什么这个正则表达式不允许这个文本?

时间:2013-02-20 19:57:39

标签: c# regex validation

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

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

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

  1. 介于5和5之间17个字符
  2. 至少包含一个字母
  3. 没有空格
  4. 没有特殊字符

3 个答案:

答案 0 :(得分:2)

你正在不必要地逃避:如果你把你的正则表达式写成字符串之外的@,那么你不需要两个\ - 只有一个没问题。

或者:

@"\w"

"\\w"

编辑:我没有说清楚:现在由于双重逃避,你正在寻找你的正则表达式和一个w。所以你的比赛需要[某些角色] \ w来匹配(例如:“a \ w”或“a \ wwwwww”匹配。

答案 1 :(得分:1)

您的要求最好在正常的C#中处理。它们不能很好地映射到正则表达式。只需使用LINQ对其进行编码,LINQ可以像在IEnumerable<char>上一样处理字符串。

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

答案 2 :(得分:0)

可以将所有内容都作为正则表达式的一部分进行,但它并不漂亮: - )

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

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

  1. 该字符是[a-zA-Z]
  2. 之前的任何单词字符\ w
  3. 或者是[a-zA-Z]
  4. 或者是[a-zA-Z]
  5. 之后的任何单词字符\ w