我需要一个验证来测试包含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}$"