我想弄清楚如何检查一个字符串是否在字符串中有三个升序字母和/或数字。例如,如果一个字符串有“manabcrt”然后有“abc”或“castle567”,则字符串中有“567”或“castlexyzand789”它有“xyz”和789 ......所以我想检查一下。我找到了这个fiddle,但它正在为重复的字母做。
这是小提琴的代码:
var inputs = [
'helloworld',
'hellloworld',
'aaabc',
'abcddd',
'bbabba'];
var violators = [];
inputs.forEach(function(input) {
if (/(.)\1\1/.test(input)) {
violators.push(input);
}});
alert("VIOLATORS:\n" + violators.join('\n'));
答案 0 :(得分:5)
您可以通过计算升序对来检查值。
var array = ['manabcrt', 'castle567', , 'castlexyzand789', 'helloworld', 'hellloworld', 'aaabc', 'abcddd', 'bbabba'],
check = array.filter(s => {
var v = 1;
return [...s].some((c, i, a) => {
v *= parseInt(c, 36) + 1 === parseInt(a[i + 1], 36);
return ++v === 3;
});
});
console.log(check);

对案例'90'
进行一些调整,不包括'9a'
var array = ['zab', '901', '9ab', 'manabcrt', 'castle567', , 'castlexyzand789', 'helloworld', 'hellloworld', 'aaabc', 'abcddd', 'bbabba'],
check = array.filter(s => {
var v = 1;
return [...s].some((c, i, a) => {
var l = parseInt(c, 36),
r = parseInt(a[i + 1], 36);
v *= l + 1 === r && l !== 9 && r !== 10 || l === 9 && r === 0 || l === 35 && r === 10;
return ++v === 3;
});
});
console.log(check);

答案 1 :(得分:4)
这是一项沉闷的运动,但你可能最好在你的正则表达式中拼出所有可能的三胞胎(10 + 2 * 26),测试它们的存在:
(012|123|234|345|456|567|678|789|890|901|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|yza|zab|ABC|BCD|CDE|DEF|EFG|FGH|GHI|HIJ|IJK|JKL|KLM|LMN|MNO|NOP|OPQ|PQR|QRS|RST|STU|TUV|UVW|VWX|WXY|XYZ|YZA|ZAB)
当然,这种方法在非拉丁字符上失败。
要在代码中使用它,请替换
if (/(.)\1\1/.test(input)) {
violators.push(input);
}});
与
if (/(012|123|234|345|456|567|678|789|890|901|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|yza|zab|ABC|BCD|CDE|DEF|EFG|FGH|GHI|HIJ|IJK|JKL|KLM|LMN|MNO|NOP|OPQ|PQR|QRS|RST|STU|TUV|UVW|VWX|WXY|XYZ|YZA|ZAB)/.test(input)) {
violators.push(input);
}});
答案 2 :(得分:2)
使用Array.filter()
和String.charCodeAt()
函数:
var inputs = ['manabcrt', 'castle345', 'helloworld', 'abcddd', 'password'],
invalid_items = inputs.filter(function(w){
var len = w.length; // word length
for (i=0; i<=len-3; i+=3) { // iterating over 3-char sequences
var char_code = w[i].charCodeAt(0);
if (w[i+1].charCodeAt(0) - char_code == 1 &&
w[i+2].charCodeAt(0) - char_code == 2) {
return true;
}
}
return false;
});
console.log(invalid_items);
&#13;
答案 3 :(得分:0)
对于任何子字符串长度
function containsNAscLetters(input, n){
for(var j = 0; j<=input.length-n; j++){
var buf = input.substring(j, j+n);
if (buf.split('').sort().join('').toString()===buf) return buf;
}
return null;
}
containsNAscLetters("avfabc", 3)
答案 4 :(得分:0)
没有太多的复杂性,你可以使用for
循环,甚至允许长度大于3的序列:
function hasAscSequence(str, limit){
var count = 0;
for(var i = 1; i<str.length;i++){
if(str.charCodeAt(i) - str.charCodeAt(i-1) == 1) count++;
else count = 0;
if(count == limit-1) return true
}
return false;
}
var inputs = [
'helloworld',
'hellloworld',
'aaabc',
'abcddd',
'bbabba'];
console.log(inputs.filter(x=>!hasAscSequence(x, 3)));
&#13;
答案 5 :(得分:0)
如果您也不想连续匹配3个降序字符:
let inputs = [
'helloworld',
'hellloworld',
'aaabc',
'abcddd',
'bbabba',
'cbaheop'
],
valid = [];
inputs.forEach((password) => {
let passValid = true;
for (i = 0; i < password.length - 2; i++) {
let currentChar = password.charCodeAt(i),
oneCharLater = password.charCodeAt(i + 1),
twoCharLater = password.charCodeAt(i + 2);
if ((currentChar + 1 === oneCharLater && currentChar + 2 === twoCharLater) || (currentChar - 1 === oneCharLater && currentChar - 2 === twoCharLater)) {
passValid = false;
break;
}
}
if (passValid) {
valid.push(password)
}
})
console.log(valid)