将正则表达式与AND结合使用

时间:2012-01-31 17:05:22

标签: regex

假设我对密码有多种要求。第一个是密码必须是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”条件放在一起吗?如果没有,推荐的方法是什么?

1 个答案:

答案 0 :(得分:2)

我建议您完成几项测试。你提出的复合正则表达式对于默默无闻是不透明的,因此难以调试和维护。如果你坚持将它全部保存在一个正则表达式中,那么我建议你使用/x修饰符(MS C ++中的IgnorePatternWhitespace选项),这样你就可以使用空格使其清晰易读,并使用零断言的宽度前瞻,比如

/ ^ 
  (?=.*[A-Z])
  (?=.*[a-z])
  (?=.*[0-9])
  (?=.*[#$!&*@()])
  [A-Za-z].{6,18}[A-Za-z]
  $
/x;