简化用户名的正则表达式

时间:2012-09-05 10:04:01

标签: c# regex

我对用户名有一个非常复杂的验证规则,我希望有人可以帮助我提高我的正则表达式。规则是:

用户可以使用他的15位唯一ID登录

使用符合以下规则的用户名登录:

  • 可以包含希腊语和英语(大写和小写)字符
  • 可以包含数字
  • 可以包含符号:!@#$ * _
  • 长度:至少7.最多14
  • 必须至少包含5个字符(来自之前所述的英文,希腊文和符号字符)且至少包含2个数字

现在这是我创造的野兽

^\d{15}$|^(?=[a-zA-z0-9\p{IsGreekandCoptic}!@#$*_]{7,14}$)(?=.*[0-9].*[0-9])(?=.*[a-zA-z\p{IsGreekandCoptic}!@#$*_].*[a-zA-z\p{IsGreekandCoptic}!@#$*_].*[a-zA-z\p{IsGreekandCoptic}!@#$*_].*[a-zA-z\p{IsGreekandCoptic}!@#$*_].*[a-zA-z\p{IsGreekandCoptic}!@#$*_]).*

虽然这有效,但我希望能让它变得更好。我是用C#写的

2 个答案:

答案 0 :(得分:3)

我将这个怪物分成了一系列支票。前三个项目可以使用相对简单的正则表达式进行检查,而最后两个项目必须更好地完成:

if(username.Length < 7 || username.Length > 14) return false;
if(username.CountDigits() < 2) return false;

答案 1 :(得分:0)

如果您没有针对速度进行优化,这是一个仅使用正则表达式的可维护版本:

bool valid = Regex.IsMatch(s, @"^\d{15}$|^(?=[a-zA-z0-9\p{IsGreekandCoptic}!@#$*_]{7,14}$)") &&
             Regex.Matches(s, @"\d").Count >= 2 &&
             Regex.Matches(s, @"[a-zA-z\p{IsGreekandCoptic}!@#$*_]").Count >= 5;