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

jee*_*wan 3 javascript regex

我试图找出它如何检查字符串是否在字符串中有三个升序字母和/或数字.例如,如果一个字符串有"manabcrt"然后有"abc"或"castle567",则字符串中有"567"或"castlexyzand789"它有"xyz"和789 ......所以我想检查一下.我发现这个小提琴,但它正在为重复的字母做.

这是小提琴的代码:

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'));
Run Code Online (Sandbox Code Playgroud)

col*_*sar 5

这是一个乏味的练习,但您可能最好在正则表达式中拼出所有可能的三元组 ( 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)
Run Code Online (Sandbox Code Playgroud)

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

请参阅现场演示 (Regex101)

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

if (/(.)\1\1/.test(input)) {
    violators.push(input);
}});
Run Code Online (Sandbox Code Playgroud)

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);
}});
Run Code Online (Sandbox Code Playgroud)

  • 这个问题被标记为正则表达式,这是唯一的正则表达式答案。即使它不是一个漂亮和现实的解决方案,它也是有效的。**那么为什么不赞成**?(PS。你可以跳过大写测试,只需为不区分大小写的测试添加`i`标志。) (3认同)

Nin*_*olz 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);
Run Code Online (Sandbox Code Playgroud)

一些调整案件'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);
Run Code Online (Sandbox Code Playgroud)