我对用户名有一个非常复杂的验证规则,我希望有人可以帮助我提高我的正则表达式。规则是:
用户可以使用他的15位唯一ID登录
或 的
使用符合以下规则的用户名登录:
现在这是我创造的野兽
^\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#写的
答案 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;