如何检查字符串是否至少包含5个唯一字符并且长度至少为7个字符


How to check that a string contains at least 5 unique characters and is minimum 7 characters long?

我需要一个验证来测试包含5个唯一字符且长度至少为7个字符的字符串。

我已经用以下正则表达式进行了尝试:

^[a-zA-Z][0-9]{7}$  

我被卡住了,不知道如何进行验证,以便字符串至少包含5个唯一字符。

我不认为用正则表达式检查其中是否至少有5个唯一字符会很容易,所以我使用另一种方法。

我用preg_match()检查,你的字符串只包含这个字符类[a-zA-Z0-9]中的字符,并且至少有7个字符长,我用量词{7,}检查。

然后,为了确保您有>=5个唯一字符,我用str_split()将您的字符串拆分成一个数组,用array_unique()获取所有唯一字符,并用count()检查是否有>=5个唯一字符(例如)

if(preg_match("/^[a-zA-Z0-9]{7,}$/", $input) && count(array_unique(str_split($input))) >= 5) {
    //good
} else {
    /bad
}

因此,从这个问题来看,还不清楚您是想用php还是javascript进行验证,使用javascript添加类似的代码。

var regex = /^[a-zA-Z0-9]{7,}$/;
// Adding method on prototype, so that can be invoked on array
Array.prototype.unique = function() {
  var arr = this; // Cache array
  // Return the array by removing duplicates
  return this.filter(function(e, i) {
    return arr.indexOf(e) === i;
  });
};
// Binding keyup event on textbox(Demo Purpose)
document.getElementById('text').addEventListener('keyup', function(e) {
  var str = this.value; // Get value
  this.classList.remove('invalid'); // Remove classes
  // Check if regex satisfies, and there are unique elements than required
  if (regex.test(str) && str.split('').unique().length >= 5) {
    console.log('Valid');
    this.classList.add('valid'); // Demo Purpose
  } else {
    console.log('Invalid');
    this.classList.add('invalid'); // Demo Purpose
  }
}, false);
.valid {
  border: solid 1px green;
}
.invalid {
  border: solid 1px red;
}
<input id="text" type="text" />


为了完整起见,这里有一个只使用正则表达式的解决方案:

~^
  (?=.{7,})
    ([a-z'd])[a-z'd]*
    (?!'1)([a-z'd])[a-z'd]*
    (?!'1|'2)([a-z'd])[a-z'd]*
    (?!'1|'2|'3)([a-z'd])[a-z'd]*
    (?!'1|'2|'3|'4)([a-z'd])[a-z'd]*
$~i

简单解释:

  • (?=.{7,})确保从字符串的开始到结束至少有7个字符
  • 然后有5个具有负前瞻性的捕获组,这确保了他们的匹配不会出现在4个捕获组中的任何其他捕获组中。因此,这可以确保字符串中至少有5个唯一字符
  • 捕获组周围的[a-z'd]*和负面前瞻只是简单地说,这5个独特的字符周围可能有各种各样的东西

(正则表达式可能仍然可以优化)

我想你想要{6,}来表示七个或更多。除了为"5个或更多不同的"生成正则表达式之外,您可能还需要做一些事情

或者^[a-zA-Z0-9]{7,}如果括号错误的话。

我不知道php,但下面是我将用于5个不同部分的算法:

int seen[256] = {0};
int ndiff = 0;
for each char c in string {
    seen[c]++;
 }
 for (int i = 0; i < 256; ++i) {
     if (seen[i]) ndiff++;
  }

我认为你的括号太多了
@"^[a-zA-Z0-9]{7}$"