Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于检查是否存在4个不同字符组中的至少3个的正则表达式_Javascript_Regex_Passwords - Fatal编程技术网

Javascript 用于检查是否存在4个不同字符组中的至少3个的正则表达式

Javascript 用于检查是否存在4个不同字符组中的至少3个的正则表达式,javascript,regex,passwords,Javascript,Regex,Passwords,我正在尝试编写一个密码验证程序 如何查看提供的字符串是否至少包含3个不同的字符组 检查它们是否存在很容易——但至少有3个 至少八(8)个字符 至少三个不同的角色组 大写字母 小写字母 数字的 特殊字符!@$%&/=?。,:-\ (我正在为正则表达式使用javascript)我假设您将为不同的需求使用不同的正则表达式。在这种情况下,请告诉我以下各项是否适合您: var e = password.match(/.{8,}/); //At least 8 chars var a = passwo

我正在尝试编写一个密码验证程序

如何查看提供的字符串是否至少包含3个不同的字符组

检查它们是否存在很容易——但至少有3个

  • 至少八(8)个字符

  • 至少三个不同的角色组

    大写字母

    小写字母

    数字的

    特殊字符!@$%&/=?。,:-\


(我正在为正则表达式使用javascript)

我假设您将为不同的需求使用不同的正则表达式。在这种情况下,请告诉我以下各项是否适合您:

var e = password.match(/.{8,}/); //At least 8 chars

var a = password.match(/[0-9]+/); //numeric
var b = password.match(/[A-Z]+/); //Capitals
var c = password.match(/[a-z]+/); //small letters
var d = password.match(/[!@#\$%&/=?_.,:;-\\]+/); //special chars

if (a + b + c + d > 2 && e) {// Success}
else {// Failure}

克里姆森的回答对我不起作用。这是我的

var mystring = 'bLahbla\\';
var valid_char_count = 0;
var lc = mystring.match(/[a-z]+/);
var uc = mystring.match(/[A-Z]+/);
var dc = mystring.match(/[0-9]+/);
var sc = mystring.match(/[\!\@\#\$\%\&\=\?\_\.\,\:\;\-\\]/);

if( lc ){ valid_char_count++; }
if( uc ){ valid_char_count++; }
if( dc ){ valid_char_count++; }
if( sc ){ valid_char_count++; }

if( valid_char_count >= 3 ){ /* success */ }

只是想了解一下,这种需求是否可以在纯正则表达式中实现

这将使它成为一个很难阅读(因此也很难维护)的解决方案,但它是:

(?mx)
^
(
  (?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])                # must contain a-z, A-Z and 0-9
  |                                                # OR
  (?=.*[a-z])(?=.*[A-Z])(?=.*[!@\#$%&/=?_.,:;\\-]) # must contain a-z, A-Z and special
  |                                                # OR
  (?=.*[a-z])(?=.*[0-9])(?=.*[!@\#$%&/=?_.,:;\\-]) # must contain a-z, 0-9 and special
  |                                                # OR
  (?=.*[A-Z])(?=.*[0-9])(?=.*[!@\#$%&/=?_.,:;\\-]) # must contain A-Z, 0-9 and special
)
.{8,}                                              # at least 8 chars
$
(可怕的)Javascript演示:

var pw = "aa$aa1aa";
if(pw.match(/^((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])|(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%&\/=?_.,:;\\-])|(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%&\/=?_.,:;\\-])|(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%&\/=?_.,:;\\-])).{8,}$/)) {
  print('Okay!');
} else {
  print('Fail...');
}

打印:
好的,如上所示。

这将在一个正则表达式中完成所有这些操作


^.*(?=.{8,})(?=.[a-z])(?=.[a-z])(?=.[\d\W])(?=.[!@\$%&/=?\u\,:;-\])。$
不妨加入到乐趣中来:

String.prototype.isValidPW = function(){   
    // First, check for at least 8 characters
    if (this.length < 8) return false;

    // next, check that we have at least 3 matches
    var re = [/\d/, /[A-Z]/, /[a-z]/, /[!@#$%&\/=?_.,:;-]/], m = 0;
    for (var r = 0; r < re.length; r++){
        if ((this.match(re[r]) || []).length > 0) m++;
    }

    return m >= 3;
};

if ("P@ssW0rd".isValidPW()) alert('Acceptable!');
String.prototype.isValidPW=function(){
//首先,检查至少8个字符
如果(this.length<8)返回false;
//接下来,检查我们是否至少有3个匹配项
变量re=[/\d/,/[A-Z]/,/[A-Z]/,/[!@$%和\/=?,:;-]/],m=0;
对于(var r=0;r0)m++;
}
返回m>=3;
};
如果(”P@ssW0rd“.isValidPW())警报('Acceptable!'”);

/**
*函数确定,我们是否有有效密码
* 
*@param{String}值
*@return{Boolean}
*/
函数isValidPassword(值){
//这里我们定义所有参数
var validLength=8,
minSuccess=3,
isNumeric=+/\d+/.test(值),
isCapitals=+/[A-Z]+/.test(值),
isSmall=+/[a-z]+/.test(值),
isSpecial=+/[!@$%&\/=\?,:;\-]+/.测试(值);
if(value.length
非常好且简单的解决方案。非常可读。谢谢。我只是想了解一下-这种需求可以在纯正则表达式中实现吗?@Yonder:是和否。你可以验证它是否有
[A-Z]
[A-Z]
[0-9]
[]
,但不是四分之三(我知道)没有将其拆分为单独的功能。顺便问一下,当放入字符类时,是否有必要对字符进行转义,即在[]括号中?@Yonder:仅对正则表达式有意义的字符。e、 句点(
)表示“任何字符”,因此当您需要文字句点时,可以使用
\。
。与
$
(行尾)相同,
/
(在本例中,因为它是模式包装器),
(表示字符是可选的,或者是取消冻结标志),
-
在类中(
[]
)表示范围,因此您可以在类的末尾使用它,或者将它转义,等等。作为一个副词,我一直希望正则表达式能够存储模式。我发现自己多次重复使用patters,这并不是一个有意义的选择。基本上,类似于
(?\A[A-z])
的东西将
\A
分配给
[A-z]
。“我想我会继续做梦的。”布拉德,这是个好主意。当然,您可以从字符串构建您的模式,并连接它们,然后执行
newregexp(a+“@”+a)
,其中
a
是预定义的模式字符串。(但你可能已经意识到了…@BartKiers:这就是我一直在做的事情,只是为了便于维护,但是如果能看到“regex宏”就好了。可能在模式开始时强制定义,然后允许在该模式的持续时间内使用。;-)@布拉德,很多正则表达式爱好者都会欢迎这种欺骗(像我一样),但是,你可能知道,对于每一个正则表达式爱好者来说,大概有10个人反对在一种已经“难懂”的语言中引入这种捷径@巴特基尔斯:我同意,我们需要带回
:标签和
转到
吗?你知道他们怎么说用正则表达式解决问题::露齿而笑:我应该补充一点,IE6不支持lookahead,但它并没有从我的四分之三中获得三分。“Password”和“Password”在这种模式下是可以接受的(缺少有效的数字或特殊字符)。这一个似乎对我有效…Password和Password对我无效,但PassW0rd succeedsIE6确实支持前瞻;它只是一辆马车。我不知道它是否已经修复,但我很确定它至少在IE7中仍然被破坏。解决方法是在其他lookaheads之前执行最小长度检查-
(?=.{8,})
,您已经在执行此操作。是否需要两个。*模式匹配(在lookaheads之前和之后各一个)?似乎在^和$之间只需要1“.*”。此外,这并不能确保你有4个类中的3个。您**必须**具有大写和小写字符;你必须至少有一个数字或特殊字符。例如,'pa$$w0rd'将不匹配,即使它有3个类。很好的一个。请注意,您不需要在角色类中转义
$
。@BartKiers:有趣的故事是:我意外地转义了
]
,并得到了JS错误。我对这个模式没有被接受感到有点困惑,我逃避了一切,一个接一个地删除了``s。然后,一个头部抓伤后,我抓住了它,忘了把其余的都换掉哎呀:;-)最酷的是不要把它放在String.pr中
/**
 * Function determine, wheter we have valid password
 * 
 * @param {String} value
 * @return {Boolean}
 */
function isValidPassword(value) {
    // Here we define all our params
    var validLength = 8,
        minSuccess  = 3,
        isNumeric   = + /\d+/.test(value),
        isCapitals  = + /[A-Z]+/.test(value),
        isSmall     = + /[a-z]+/.test(value),
        isSpecial   = + /[!@#$%&\/=\?_\.,:;\-]+/.test(value);

    if (value.length < validLength) { // 8 symbols. We don`t need regexp here
        return false;
    }

    if (isNumeric + isCapitals  + isSmall + isSpecial < minSuccess) {
        return false;
    }

    return true;
}


document.writeln(isValidPassword('abc'));
document.writeln(isValidPassword('abc123ABC'));
document.writeln(isValidPassword('abc123!23'));