我正在尝试为密码字段创建一个正则表达式,用于检查输入是否包含至少两个字符集(字母,数字,标点符号,特殊字符)的混合。此外,第一个和最后一个字符不能是数字,长度必须至少为8个字符。
我从未处理正则表达式的条件逻辑,所以这可能是我遇到这么困难的原因。到目前为止,这(但它没有按预期工作):
(?=.{8,})(\d.*[a-zA-Z])|(?=.{8,})([a-zA-Z].*\d)|(?=.{8,})(\W.*\d)|(?=.{8,})(\d.*\W)|(?=.{8,})(\W.*[a-zA-Z])|(?=.{8,})([a-zA-Z].*\W)|(?=.{8,})([a-z].*[A-Z])|(?=.{8,})([A-Z].*[a-z])
答案 0 :(得分:1)
就个人而言,我不会用一个正则表达式来做这件事。为什么不通过一组更简单的方法来运行它,只是为了节省自己不可避免的维护难题?像(按顺序,伪代码):
// First and last are non-numeric and length check
if (!regex_check(pass, /^[^0-9].{6}.*[^0-9]$/)) return false
regexes = {/[a-zA-Z]/, /[0-9]/, /\p{P}|\p{Sc}|\^/} // Different character categories
numCategories = 0
for r in regex
if (regex_check(pass, r)) numCategories += 1
if numCategories >= 2 return true
return false