0

パスワード規則の要件があります。以下がルールです。

パスワードは、次のガイドラインに従う必要があります。

  • 8 文字以上の長さ
  • 次の 4 つのオプションのうち 3 つを含む: 小文字、大文字、数字、または特殊文字
  • ユーザーが上記の規則を満たさないパスワードを指定すると、次のメッセージが返されます。

    パスワードは 8 文字以上で、次の 4 つのオプションのうち 3 つを含む必要があります。

    • 小文字 (az)
    • 大文字 (AZ)
    • 数字 (0-9)
    • 特殊文字 (!@#$%^&')

上記の条件を処理するための正規表現を取得するのを手伝ってください。

私はあなたのすべての助けに感謝します. 以下は私の要件の解決策です

if(password.matches("^(?=.*[0-9]).{1,}$")){
validCount++;
}
if(password.matches("^(?=.*[a-z]).{1,}$")){
validCount++;
}
if(password.matches("^(?=.*[A-Z]).{1,}$")){
validCount++;
}
if(password.matches("^(?=.*[@#$%^&+=]).{1,}$")){
validCount++;
}
return validCount >= 3 ? true : false;

ありがとう、ラムキ

4

2 に答える 2

11

これは、エレガントな正規表現が必要な場合、可能な限り近いものです

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&'])[^ ]{8,}$

基本的な考え方は、「ポジティブ ルックアヘッド」と呼ばれる手法を使用することです。

(?=.*PutHereWhatYouWantToAllow)

追加の要件 4 つのうち 3 つを正規表現で解決するのは簡単ではないため、基本的にそれらをカウントすることはできません。上記の正規表現の必要な順列を書き出すこともできますが (それが意味をなさない場合は教えてください)、非常に長い正規表現になります。あなたができることは、パターンを文字通り繰り返さないので、正規表現が保守可能のままになるように、順列をコードに書き出すことです。

あなたの言語 (C#?) を教えていただければ、挑戦します。

更新 1

これは、要件の少なくとも 3 つ (4 つも許可されます) に一致する正規表現です。これを本番環境で使用しないでください。コメントに記載されているように、個々の正規表現を使用して言語をループします。

^(((?=. [az]. [AZ]. [\d])|(?=. [az]. [\d]. [AZ])|(?=. [AZ]. [az]. [\d])|(?=. [AZ]. [\d]. [az])|(?=. [\d]. [az]. [AZ])|(?=. [\d] . [AZ]. [az])|(?=. [az]. [AZ]. [!@#$%^&'])|(?=. [az]. [!@#$%^& ']. [AZ])|(?=. [AZ]. [az]. [!@#$%^&'])|(?=. [AZ]. [!@#$%^&'] . [az])|(?=. [!@#$%^&']. [az]. [AZ])|(?=. [!@#$%^&']. [AZ]. [ az])|(?=. [az]. [\d]. [!@#$%^&'])|(?=.[az]。[!@#$%^&']。[\d])|(?=. [\d]. [az]. [!@#$%^&'])|(?=. [\d]. [!@#$%^&'] . [az])|(?=. [!@#$%^&']. [az]. [\d])|(?=. [!@#$%^&']. [\d] . [az])|(?=. [AZ]. [\d]. [!@#$%^&'])|(?=. [AZ]. [!@#$%^&']. [\d])|(?=. [\d]. [AZ]. [!@#$%^&'])|(?=. [\d]. [!@#$%^&'] . [AZ])|(?=. [!@#$%^&']. [AZ]. [\d])|(?=. [!@#$%^&']. [\d] . [AZ]))[^ ]{8,}$

更新 2

これはJavaでとるアプローチです

私が読んだコメントから、あなたは次のようにテストしています

  • 小文字の "^[az]*$";
  • 大文字 "^[AZ]*$";
  • 数字="^[0-9]*$";

私はあなたがここで正しい軌道に乗っているとは思わない。小文字は、1 文字だけでなく、すべての文字が小文字である場合にのみ成功を報告します。残りの同じ発言。

これらは、少なくとも 3 つが一致を報告する必要がある 4 つの個別の正規表現です。

[a-z]
[A-Z]
\d
[!@#$%^&']

パスワードにスペースを含めないことのテストは次のとおりです。

^[^ ]*$

8文字以上のテスト

.{8,}

したがって、要件を分割し、それらを結合しません。これにより、特に正規表現で始まる場合に、コードが読みやすくなります。

于 2012-05-23T23:43:33.343 に答える
3

これが私がそれを行う方法です:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ValidatePassword
{
    public static void main (String[] args)
    {
        String pw = "abaslkA3FLKJ";

        // create an array with 4 regex patterns

        Pattern [] patternArray = {
            Pattern.compile("[a-z]"),
            Pattern.compile("[A-Z]"),
            Pattern.compile("[0-9]"),
            Pattern.compile("[&%$#]")
        };

        int matchCount = 0;

        // iterate over the patterns looking for matches

        for (Pattern thisPattern : patternArray) {
            Matcher theMatcher = thisPattern.matcher(pw);        
            if (theMatcher.find()) {
                matchCount ++;
            }
        }

        if (matchCount >= 3) {
            System.out.println("Success");
        }

        else {
            System.out.println("Failure: only " + matchCount + " matches");
        }
    }
}

4 番目のパターンにいくつかの特殊文字を追加しただけです...必要に応じて変更する必要があります。特定の文字をバックスラッシュでエスケープする必要がある場合があります。スペースがないことを確認するなど、他の制約を追加することもできます。それはあなたに任せます。

于 2012-05-24T00:43:46.267 に答える