Javascript检查字符串中的三个升序字母和数字

时间:2018-01-31 15:21:35

标签: javascript regex

我想弄清楚如何检查一个字符串是否在字符串中有三个升序字母和/或数字。例如,如果一个字符串有“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'));

6 个答案:

答案 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)

当然,这种方法在非拉丁字符上失败。

请参阅live demo (Regex101)

要在代码中使用它,请替换

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;
&#13;
&#13;

性能测试结果: enter image description here

答案 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的序列:

&#13;
&#13;
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;
&#13;
&#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)