1

私のプログラムでは、入力文字列に少なくとも 1 つの英字と 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つの巨大なテストではなく、一連の小さなテストを使用して入力を検証することには、いくつかの利点があります。

  1. 理解しやすいです。
  2. デバッグが簡単です。
  3. 将来的には保守が容易になります。(上司が別の要件を追加するとします。パスワードには少なくとも2つの記号が含まれている必要があります。)
  4. 「パスワードは満たす必要があります」などの一般的なメッセージの代わりに、パスワードが失敗した基準をユーザーに伝えることができますgiant list of criteria
于 2012-05-04T05:09:36.967 に答える