如何检查字符串是否包含至少5个唯一字符,且最少7个字符?

时间:2016-01-06 02:41:12

标签: php regex

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

我已经尝试使用以下正则表达式:

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

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

3 个答案:

答案 0 :(得分:9)

我认为如果你的正则表达式中至少有5个独特的字符,我觉得这很容易,所以我采用了另一种方法。

我与preg_match()核实,您的字符串只包含此character class [a-zA-Z0-9]中的字符,且长度至少为7个字符,我使用quantifier检查:{ {1}}。

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

{7,}

从问题来看,目前尚不清楚是否要在中执行验证,并使用Javascript添加类似的代码。

if(preg_match("/^[a-zA-Z0-9]{7,}$/", $input) && count(array_unique(str_split($input))) >= 5) {
    //good
} else {
    /bad
}
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个字符
  • 然后有5个具有负向前瞻的捕获组,这确保了它们的匹配不能在4个捕获组中的任何其他组中。因此,这可确保字符串
  • 中至少有5个唯一字符
  • 捕获组周围的(?=.{7,})和负向前瞻只是说,这5个独特字符周围可以有各种各样的东西

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

答案 1 :(得分:0)

我想,你想要7个或更多的{6,}。除了正则表达式之外,您可能需要做一些事情,以及#34; 5或更多不同的&#34;

或者^ [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++;
  }

答案 2 :(得分:-2)

我相信你的托架太多了  @&#34; ^ [a-zA-Z0-9] {7} $&#34;