用于验证密码的正则表达式模式

时间:2011-01-17 01:28:52

标签: regex groovy validation

我正在处理一个小问题,但我不知道如何解决这个问题。我必须验证生成的密码,但有一些限制:

  • 密码长度:[8,24]
  • 密码包含
    • 至少1个小写字符
    • 至少1个大写字符
    • 至少1位数
    • 至少1个特殊字符(基于ASCII码可打印)

我使用了Regex模式,但它在两种情况下都无法正常工作:有效和无效。

第一个RegEx模式:

def pattern = /(=?.{8,24})((:?[a-z]+)(:?[0-9]+)(:?[A-Z]+)(:?\W+))/ 

可以检查所有无效密码,但不能检查有效密码。

第二个RegEx模式:

def pattern = /(=?.{8,24})((:?[a-z]*)(:?[0-9]*)(:?[A-Z]*)(:?\W*))/ 

可以检查所有有效密码,但不能检查无效密码。

我是Groovy的新手,所以我不知道如何创建正确的RegEx模式来解决这个问题。 你能帮我吗?

2 个答案:

答案 0 :(得分:2)

正则表达式并不是解决所有问题的方法,并且试图为特定问题提出单一正则表达式通常会浪费大脑周期。只需将它分成多个测试,例如(这个类似Perl的伪代码,但您应该能够将其转换为您正在使用的语言):

sub valid_pw
{
    return false if (length($_) < 8 || length($_) > 24);
    # don't use [a-z], it makes for nasty surprises in e.g. fi_FI
    return false if (!/[[:lower:]]/);
    return false if (!/[[:upper:]]/);
    return false if (!/[[:digit:]]/);
    return false if (!/[[:print:]]/);
    return true;
}

答案 1 :(得分:0)

为什么你需要一个正则表达式呢? (也就是为什么你要在密码上放置一个最大长度,这是另一个讨论)

/^.{8,24}$/
/[a-z]/
/[A-Z]/
/\d/
/[^\d\w]/

我想你可以使用前瞻(比如/(?=.*[a-z])(?=.*[A-Z])...)来组合它们,但如果你这样做,那么对它进行大量评论可能是一个非常好的主意。