我需要一个验证,测试包含5个唯一字符并且长度至少为7个字符的字符串。
我已经尝试使用以下正则表达式:
^[a-zA-Z][0-9]{7}$
我卡住了,不知道如何进行验证,以便字符串包含至少5个唯一字符。
答案 0 :(得分:9)
我认为如果你的正则表达式中至少有5个独特的字符,我觉得这很容易,所以我采用了另一种方法。
我与preg_match()
核实,您的字符串只包含此character class [a-zA-Z0-9]
中的字符,且长度至少为7个字符,我使用quantifier检查:{ {1}}。
然后为了确保您拥有> = 5个唯一字符,我将您的字符串拆分为包含str_split()
的数组,并使用array_unique()
获取所有唯一字符,并与count()
一起检查是否存在是> = 5个唯一字符,例如
{7,}
从问题来看,目前尚不清楚是否要在php或javascript中执行验证,并使用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个字符(?=.{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;