这个问题真不建议用一个正则表达式来做,可以用4个正则分别匹配,然后用与操作,非要用正则的话,可以考虑在条件分支里面用零宽度断言,但是这个效率和匹配4个正则表达式是一样的
如果需要限定长度为10-20就用这个
^(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^A-Za-z0-9])).{10,20}$
如果不需要限定长度,那么就
^(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^A-Za-z0-9])).*$
不限制密码几位的话很难写啊,因为没有要求具体哪位是大写或者数字,我完全可以100位以后再有大写或者数字,这个用正则无法实现,用逻辑判断倒是可以实现
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,.\/]).{6,16}$
我还没验证额,看不懂