Javascript 在不满足正则表达式的情况下准确获取密码

Javascript 在不满足正则表达式的情况下准确获取密码,javascript,jquery,regex,Javascript,Jquery,Regex,我对正则表达式有如下的关注 /^(?=^.{8,}$)(?=.*[0-9])(?=.+[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":;>.<;,]).{1,}$/ 我已将此正则表达式用于密码策略,即如下所示 /^(?=^.{8,}$)(?=.*[0-9])(?=.+[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":;>.&am

我对正则表达式有如下的关注

/^(?=^.{8,}$)(?=.*[0-9])(?=.+[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":;>.<;,]).{1,}$/
我已将此正则表达式用于密码策略,即如下所示

/^(?=^.{8,}$)(?=.*[0-9])(?=.+[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":;>.<;,]).{1,}$/
  • 至少1个大写字符[A-Z]
  • 至少1个小写字符[a-z]
  • 至少1个特殊字符[!@$%^]
  • 至少1位数字[0-9]
  • 最少8个字符
但是每当我测试它的时候,模式就会出错。例如,在这类输入中

例:

詹姆士1234

果酱

1234詹姆斯

1234詹姆斯


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

我注意到您没有在正则表达式中的保留字符之前使用“\”。 例如:
()
都是保留的,因此在正则表达式中它们前面需要一个
\

而且不需要使用
{1,}$

这可能会解决这个问题,尽管我没有使用您需要的所有特殊字符


/^(?=.[A-Z])(?=.[A-Z])(?=.[0-9])(?=.[!@\$%\^&*])(?=.{8,})/

我注意到在正则表达式中的保留字符之前没有使用“\”。 例如:
()
都是保留的,因此在正则表达式中它们前面需要一个
\

而且不需要使用
{1,}$

这可能会解决这个问题,尽管我没有使用您需要的所有特殊字符


/^(?=.[A-Z])(?=.[A-Z])(?=.[0-9])(?=.[!@$%^&*])(?=.{8,})/

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

在我看来,像这样的单个正则表达式有一些缺点,很难读取和调试。此外,也无法判断哪些规则实际导致检查失败。 你可以考虑把它分解成更小的检查,这也会很容易在以后添加额外的规则。

<?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";
};

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

在我看来,像这样的单个正则表达式有一些缺点,很难读取和调试。此外,也无法判断哪些规则实际导致检查失败。 你可以考虑把它分解成更小的检查,这也会很容易在以后添加额外的规则。

<?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";
};

我想你的正则表达式被一个HTML转义器击中了&表示“a”或“m”或。。。。etc@zzxyz我也尝试过删除这个,但仍然不起作用。我想你的正则表达式被一个HTML转义器击中了&表示“a”或“m”或。。。。etc@zzxyz我也尝试过删除这个,但仍然不起作用。我认为它们不需要在[]@Boo内转义。它对我起作用。你能告诉我,在你建议的代码中,由于不允许空间或空间,我需要做哪些更改吗tab@NaveenK.Sanadhya很抱歉回复晚了。但是为了避免空白,在正则表达式的末尾添加
\S*$
,所以:
/^(?=.[A-Z])(?=.[A-Z])(?=.[0-9])(?=.[!@\$%\^&*])(?=.{8,})\S*$/
@zzxyz在我的浏览器控制台中它对我不起作用,因为一些奇怪的原因:/所以我只是认为这可能是原因。我不认为它们需要在[@Boo里面转义它对我起作用,你能告诉我,在你建议的代码中,我需要做哪些修改,以避免出现空格或空格吗tab@NaveenK.Sanadhya很抱歉回复晚了。但是为了避免空白,在正则表达式的末尾添加
\S*$
,所以:
/^(?=.[A-Z])(?=.[A-Z])(?=.[0-9])(?=.[!@.\$%\^&*])(?=.{8,})\S*$/
@zzxyz在我的浏览器控制台中它对我不起作用,因为一些奇怪的原因:/所以我只是认为这可能是原因。你甚至可以给每个正则表达式起一个名字,给每个字段一个正确的数组,让一个函数执行所有验证您甚至可以给每个正则表达式一个名称,给每个字段一个正确的数组,让一个函数执行所有验证