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 控制台(萤火虫或其他)试试这个:

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

这是因为\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 回答
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 回答