请问这样用来判断密码的正则如何去写?

主要是用来判断密码,

必须要有数字,字母大小写必须也要有一项,也可以都有,特殊字符可有可无,有的话,只能有 !@# 这三个符号,请问这样的正则如何去写

网上找了个这个但是好像还是有点严格
/^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[^\sA-Za-z0-9])\S{8,20}$/

阅读 2k
4 个回答

不一定要是正则

function validPasswd(passwd) {
    let len = passwd.length
    if (len<8 || len>20) {
        return false
    }

    let num = 0
    let upper = 0
    let lower = 0
    for (let i = 0; i<passwd.length; i++) {
        let c = passwd[i]
        if (c>='0' && c<='9') {
            num++
        } else if (c>='A' && c<='Z') {
            upper++
        } else if (c>='a' && c<='z') {
            lower++
        } else if (c=='!' || c=='@' || c=='#') {
            
        } else {
            return false
        }
    }
    return num>0 && (upper>0 || lower>0)
}

要不你试试这个:

/^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#])([a-zA-Z0-9!@#]+)$/

大小写都要有的话就这个:

/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#])([a-zA-Z0-9!@#]{8,20})$/

希望能帮助到你。

你试试我这个,刚写的,我自测了下没发现啥问题

/(?=.*[0-9])(?=.*[a-zA-Z])^[0-9a-zA-Z!@#]{8,20}$/

可归纳为

  • 必须包含数字、字母
  • 只能包含数字、字母、!@#

不用预查的做法

/\d/.test(pwd) && /[a-z]/i.test(pwd) && /^[\da-z!@#]+$/i.test(pwd)

用预查的做法

/^(?=.*\d)(?=.*[a-z])[\da-z!@#]+$/i.test(pwd)

测试用例

[
'1',
'a',
'!',
'1!',
'A!',
'1A%',
'1A',
'!A1'
].map(s => /^(?=.*\d)(?=.*[a-z])[\da-z!@#]+$/i.test(s))

相关知识:正则表达式预查的解释与应用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题