我打算写一个正则表达式,只有当一个字符串包含至少n个不同类别的字符时才会匹配。我打算用它来强制我的用户创建强密码,并想检查密码是否包含以下至少3个:
如果所有这些类都存在,则编写匹配的正则表达式使用前瞻是微不足道的。但是,我无法绕过“至少3”部分。这甚至是可能的(在一个漂亮,紧凑的表达中)还是我必须创建一个怪物表达式?
答案 0 :(得分:6)
我认为这比列出4中的3个的每个可能组合更紧凑。它利用负向前瞻来确保整个字符串不仅仅由您列出的一个或两个字符类组成:
(?!([a-zA-Z]*|[a-z\d]*|[^A-Z\d]*|[A-Z\d]*|[^a-z\d]*|[^a-zA-Z]*)$).*
按顺序,这里的小组是:
如果整个字符串(由于否定前瞻中的$
)仅包含来自上述任何组的字符,则此正则表达式将失败。
答案 1 :(得分:2)
你必须为4个中的3个(总共4个表达式)的每个可能组合写一个表达式,然后是|将各个表达式放在一起,以便它们在满足至少一个原始表达式时通过。
答案 2 :(得分:0)
您对此解决方案有何看法?
var str='23khkS_s';
var countGroups=0;
if(str.match(/[a-z]+/))
countGroups++;
if(str.match(/[A-Z]+/))
countGroups++;
if(str.match(/[0-9]+/))
countGroups++;
if(str.match(/[-_!@#$%*\(\)]+/))
countGroups++;
console.log(countGroups);
不使用1个类似怪物的表达式,而是使用4个小RE。然后使用变量countGroups
,其中包含多个maеched字符组。
我希望它是有帮助的