不满足正则表达式即可准确获取密码

时间:2018-08-14 06:15:03

标签: javascript jquery regex

我对正则表达式感到担忧,详情如下

/^(?=^.{8,}$)(?=.*[0-9])(?=.+[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":;>.<;,]).{1,}$/

我已将此正则表达式用于密码策略,即如下

  • 至少1个大写字符[A-Z]
  • 至少1个小写字符[a-z]
  • 至少有1个特殊字符[!@#$%^]
  • 至少1位数字[0-9]
  • 最少8个字符

但是,每当我对其进行测试时,模式都会出错。例如,在这样的输入中,例如

  

例如:

     

James1234

     

jam123Es

     

1234James

     

1234jaMeS

在这些示例中,我没有应用任何特殊字符,而是让它满足了正则表达式。

2 个答案:

答案 0 :(得分:3)

我知道这不能回答您的实际问题,但是其他人已经回答了,所以我想我还是会分享我的想法。

我认为像这样的单个正则表达式有一些缺点,很难读取和调试。同样,也无法分辨出哪些规则实际上使检查失败。 您可以考虑将其细分为较小的支票,这也将使以后轻松添加其他规则变得容易。

<?php
$check = function (string $p): string
{
    if (strlen($p) < 8) {
        return "Not long enough";
    }

    if (!preg_match('/[A-Z]/', $p)) {
        return "No upper case character";
    }

    if (!preg_match('/[a-z]/', $p)) {
        return "No lower case character";
    }

    if (!preg_match('/\d/', $p)) {
        return "No digits";
    }

    if (!preg_match('/[!@#$%^]/', $p)) {
        return "No special character";
    }


    return "OK";
};

答案 1 :(得分:0)

我注意到您在正则表达式中的保留字符之前没有使用'\'。 例如:private async void test3() { FirebaseResponse resp = await client.GetTaskAsync("serverStats/1"); Data get = resp.ResultAs<Data>(); Logger.WriteLog("test_log.txt", "test3 serverName=" + get.serverName + " serverStatus=" + get.serverStatus); } 已全部保留,因此在正则表达式中需要( )之前。

并且不需要使用\

尽管我没有使用您需要的所有特殊字符,但这也许可以解决问题。

.{1,}$