1

我有一个相当复杂的用户名验证规则,我希望有人可以帮助我改进我的正则表达式。规则是:

用户可以使用他的 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# 编写

4

2 回答 2

3

我会把这个怪物分成一系列的检查。可以使用相对简单的正则表达式检查前三个项目,而后两个项目最好通过命令式完成:

if(username.Length < 7 || username.Length > 14) return false;
if(username.CountDigits() < 2) return false;
于 2012-09-05T10:11:53.620 回答
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;
于 2012-09-05T11:26:48.307 回答