1

私はJavaと正規表現を使用しています。

パスワード検証用の正規表現を作成しました:

String PASSWORD_PATTERN_ADVANCED = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°\"\\]\\[²³*/+]).{8,20}$";

または余分なスラッシュなし:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°"\]\[²³*/+]).{8,20}$

どのような意味(私は間違っているかもしれません):少なくとも1桁/少なくとも1つの小文字/少なくとも1つの大文字/リストされている特殊文字の少なくとも1つ/最小全長8、最大20 .. ..

成功と失敗のパスワードを生成するテストケースを作成しました...

成功->OK、すべて合格失敗->ほぼOK..。

失敗しない唯一のパスワード:Dは、次のようにスペースが含まれているパスワードです。

 iF\ !h6 2A3|Gm 
¨I O7 gZ2%L£k vd~39 
2< A Uw a7kEw6,6S^ 
cC2c5N#  
6L kIw~ Béj7]5 
ynRZ #44ç 
9A `sè53Laj A 
s²R[µ3  9UrR q8n 

困惑しています。

それを機能させるための考えはありますか?

ありがとう

4

3 に答える 3

1

私は間違っているかもしれませんが、単にスペースが必要ない場合は、先読み[^\\s]の代わりに使用してください。.

String PASSWORD_PATTERN_ADVANCED = 
         "^(?=[^\\s]*\\d)"
        + "(?=[^\\s]*[a-z])"
        + "(?=[^\\s]*[A-Z])"
        + "(?=[^\\s]*[\\\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°\"\\]\\[²³*/+])"
        + ".{8,20}$";
于 2012-07-06T14:49:53.837 に答える
1

正規表現は、ここでの作業に適したツールではない可能性があります。

正規表現は、パターンのマッチングに最適です。あなたが説明しているのは、それ自体が実際のパターンではありません。それはもっとルールセットです。確かに、役立つ正規表現を作成できる場合もありますが、これは非常に複雑で不透明なコードであり、メンテナンスが困難になります。

このような方法の方が適している可能性があります。

public boolean isValidPassword(String password) {
    boolean containsLowerCase;
    boolean containsUpperCase;
    boolean containsInvalid;
    boolean containsSpecialChar;
    boolean containsDigit;

    for(char c: password.toCharArray()) {
        containsLowerCase   ||= Character.isLowerCase(c);
        containsUpperCase   ||= Character.isUpperCase(c);
        containsDigit       ||= Character.isDigit(c); 
        containsSpecialChar ||= someMethodForDetectingIfItIsSpecial(c);

    }

    return  containsLowerCase &&
            containsUpperCase &&
            containsSpecialChar &&
            containsDigit &&
            !containsInvalid &&
            password.length >=8 && password.length <=20;

}

specialCharArray.contains(c)特殊文字( 、正規表現など)を検出するための最良の方法を決定する必要があります。

ただし、このアプローチでは、新しいルールの追加がはるかに簡単になります。

于 2012-07-06T15:17:27.603 に答える
0

あなたの条件のどれも、パスワードに含めることができないものを述べているのではなく、しなければならないものだけを述べています。可能なすべての有効な文字を組み合わせ、パスワード内のすべての文字がそのリストに含まれていることを確認する(つまり、(\d|[a-z]|[A-Z]|@#$...){8,20}最終条件として)もう1つの条件が必要です。それまたは拒否された文字のリスト。

于 2012-07-06T14:46:13.567 に答える