1

パスワード検証のために正規表現を試しています

^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,}$

少なくとも1桁、大文字1文字と小文字1文字を制限しますね。
では、なぜ次のような結果になるのtrueでしょうか。

(new RegExp('^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,}$')).test('aaAAffffaAfDvad')

しかし、次のものはfalse

(new RegExp('^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,}$')).test('aaAA112')
4

3 に答える 3

1

JS コンソール (firebug またはその他) でこれを試してください:

var re = /^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$/

次に、これ:

var re2 = new RegExp('^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$')

次に、結果を確認するだけです... re2 では\d、正規表現では適切にエスケープされていませんが、文字列ではエスケープされていることがわかります。

編集: Javascriptが見つかりました:表現が何であってもRegExpが機能しません

于 2012-11-28T10:29:36.367 に答える
1

おそらく最も効率的な方法ではありませんが、非常に拡張可能です。

requirements = [ /\d/, /[A-Z]/, /[a-z]/, /^.{6,20}$/ ];

function passwordValid( password ) {
    var i = requirements.length;

    while( i-- ) {
        if( !requirements[i].test( password ) ) return false;
    }
    return true;
}
于 2012-11-28T11:02:50.380 に答える
1

これは、\in\dが正しくエスケープされていないためです。

>>> var x = new RegExp('^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$');
>>> x
/^(?=.*d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$/

>>> var x = new RegExp('^(?=.*\\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$');
>>> x
/^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$/

この関数を使用して、正規表現を適切にエスケープすることもできます。

RegExp.escape = function(s) {
    return s.replace( /[-\/\\^$*+?.()|[\]{}]/g, "\\$&" );
};
var x = new RegExp( RegExp.escape( '^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$') );
于 2012-11-28T10:32:09.100 に答える