正则表达式至少匹配m组中的n个

Regular Expression matching at least n of m groups

本文关键字:正则表达式      更新时间:2023-09-26

我将编写一个正则表达式,它只在字符串包含至少n个不同类型的字符时才匹配。我打算用它来强制我的用户创建强密码,并希望检查密码是否包含以下至少3个:

  • 字符
  • 资本字符
  • 数字
  • 特殊字符

使用查找头编写一个匹配所有这些类的正则表达式是微不足道的。然而,我无法理解"至少3"的部分。这是否有可能(在一个漂亮的、紧凑的表达式中),或者我是否必须创建一个怪物表达式?

我认为这将比列出4个中的3个可能的组合更紧凑。它利用负向前看来确保整个字符串不是仅由您列出的一个或两个字符类组成:

(?!([a-zA-Z]*|[a-z'd]*|[^A-Z'd]*|[A-Z'd]*|[^a-z'd]*|[^a-zA-Z]*)$).*

按顺序排列:

  • 下限和/或上限
  • 小写和/或数字
  • 较低和/或特殊
  • 大写和/或数字
  • 上部和/或特殊
  • 数字和/或特殊

如果整个字符串(因为负向前看中的$)只包含上述任何组的字符,则此正则表达式将失败。

您必须为4个表达式中的3个(总共4个表达式)的每种可能组合编写一个表达式,然后将单个表达式放在一起,以便如果它们满足至少一个原始表达式,则它们通过。

您觉得这个解决方案怎么样?

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);

您可以使用4个小正则表达式,而不是使用1个怪物式表达式。然后使用变量countGroups,它包含了多个匹配的字符组。希望对大家有所帮助