1

在我的程序中,我有一个正则表达式,它确保输入字符串至少有一个字母和一个数字字符,长度在 2 到 10 之间。

Pattern p = Pattern.compile("^(?=.*\\d)(?=.*[A-Za-z])[A-Za-z0-9]{2,10}$");

根据新要求,字符串也不应包含任何紧跟相同序列的字符序列。我搜索了很多,但无法弄清楚。你能帮忙吗?或者指向我的任何 URL/文档?


非常感谢您的回复。

要求:字符串不得包含任何紧跟相同序列的字符序列。

我认为要求不明确。

我不确定“12aardvark”是否有效,因为 - 1. 有重复的“a”。与字符串“11abcdefg”相同。2. 有重复的“ar” 3. 但是“ar”后面没有紧跟相同的序列。中间有“dv”。

我认为,字符串“12ardvark”和“12aardvark”不应该通过验证,因为它有重复的字符序列:“ar”,尽管它后面没有紧跟相同的序列。

“fofo123”或“ab1212”不应该肯定通过,因为“fo”(只有 2 个字符)后面紧跟着相同的序列。

您对需求的假设是什么?

4

1 回答 1

7

单一的正则表达式并不是每个字符串验证问题的答案。

使用基本的字符串函数和多个更小的正则表达式更具可读性。(为什么要尝试使用正则表达式检查字符串的长度,什么时候length(pwd)会做同样的事情?)

下面是一些可以很好地转换为 Java 的 Python 代码:

import re
def validate_password(pwd):
    # return true if valid or false is invalid.

    if ( len(pwd) < 2 or len(pwd) > 10 ):
        print "Password %s : Failed length requirement" % pwd
        return False
    if ( re.search(r"\d", pwd) == None ):
        print "Password %s : must contain at least one number" % pwd
        return False     
    if ( re.search(r"[a-zA-Z]", pwd) == None ):
        print "Password %s : must contain at least one alphabetical character" % pwd
        return False
    if ( re.search(r"(...+)\1", pwd) != None ):
        print "Password %s : must not contain any repeating substrings of three characters or more" % pwd
        return False

    print "Password %s is OK" % pwd
    return True

test_pwds = [ "1", "123", "aardvark", "12ardvark", "12aardvark", "foofoofoo1" ]

for pwd in test_pwds:
    validate_password (pwd)

测试输出:

Password 1 : Failed length requirement
Password 123 : must contain at least one alphabetical character
Password aardvark : must contain at least one number
Password 12ardvark is OK
Password 12aardvark is OK
Password foofoofoo1 : must not contain any repeating substrings of three characters or more

使用一系列小测试而不是一个大测试来验证输入有几个好处:

  1. 更容易理解。
  2. 更容易调试。
  3. 以后更容易维护。(想象一下你的老板增加了另一个要求,即密码中必须至少出现两个符号。)
  4. 您可以告诉用户他们的密码失败的标准,而不是像“您的密码必须满足giant list of criteria”这样的通用消息。
于 2012-05-04T05:09:36.967 回答