假设我对密码有多种要求。第一个是密码必须是8-20个字符,第一个和最后一个字符必须是字母字符,中间字符是字母数字的任意组合,与几个符号混合。到目前为止我设法提出的表达是:
^ [A-ZA-Z] {1} [A-ZA-Z0-9#$&安培;!* @()] {6,18} [A-ZA-Z] {1} $
这很好用,但现在的要求是我必须至少有一个大写字符,至少一个小写字符,至少一个数字,以及至少一个提到的字符。
如何将这些要求组合到单个表达式中,以便我可以模拟如下内容:
If(Regex.IsMatch(“^[a-zA-Z]{1}[a-zA-Z0-9#$!&*@()]{6,18}[a-zA-Z]{1}$”, userInput) // Check most of the conditions (starts with alpha, ends with alpha, and is 8-20 characters total)
&& Regex.IsMatch(“[A-Z]”, userInput) // Ensure there’s an upper case
&& Regex.IsMatch(“[a-z]”, userInput) // Ensure there’s a lower case
&& Regex.IsMatch(“[0-9]”, userInput) // Ensure there’s a digit
&& Regex.IsMatch(“[#$!&*@()]”) // Ensure there’s an allowed symbol
)
{
// Do something here
}
我理解OR运算符只是|,但有一种简单的方法可以将“AND”条件放在一起吗?如果没有,推荐的方法是什么?
答案 0 :(得分:2)
我建议您完成几项测试。你提出的复合正则表达式对于默默无闻是不透明的,因此难以调试和维护。如果你坚持将它全部保存在一个正则表达式中,那么我建议你使用/x
修饰符(MS C ++中的IgnorePatternWhitespace
选项),这样你就可以使用空格使其清晰易读,并使用零断言的宽度前瞻,比如
/ ^
(?=.*[A-Z])
(?=.*[a-z])
(?=.*[0-9])
(?=.*[#$!&*@()])
[A-Za-z].{6,18}[A-Za-z]
$
/x;