匹配连续数字

时间:2015-01-27 16:08:00

标签: javascript

我正在尝试创建一个可以匹配字符串中连续数字的函数,该字符串也可以包含字母,例如:

ae12 / aeg12345km / mea65 / ab2d43a21 / poe09ac等。

该字符串应具有连续数字,这意味着序列旁边和序列中的任何数字(12是顺序的,1a2不是顺序的,09是顺序的,a0b0不是顺序的,00不是顺序的,11不是顺序的, 112是顺序的)

我进行了几个主题,似乎不可能使用正则表达式。

我创建了这个函数,但我对此并不完全满意,我想改进它:

containsSequentialDigits: function (str) {
    var array = str.split('');
    var previousC = null;
    return array.some(function (c) {
        if (isNaN(c)) {
            previousC = null;
            return false;
        }
        if (c === previousC+1 || c === previousC-1 ||
            c === 0 && previousC === 9 || c === 9 && previousC === 0) {
            return true;
        }
        previousC = c;
        return false;
    });
}

你有什么建议可以简化吗?

由于

3 个答案:

答案 0 :(得分:1)

我认为这个正则表达式应该有用

/(0[19]|1[20]|2[31]|3[42]|4[53]|5[64]|6[75]|7[86]|8[97]|9[08])/

答案 1 :(得分:0)

我也很确定正则表达式会做什么。试试这个:

function containsSequentialDigits(str) {
    return /01|12|23|34|45|56|67|78|89|90|09|98|87|76|65|54|43|32|21|10/.test(str);
}

var s = [
    's',   // false, no digits
    '1x2', // false, no consecutive digits
    '2x1', // false, dito
    '13',  // false, not "sequential"
    '12',  // true, increasing
    '21',  // true, decreasing
];

for( var i = 0; i < s.length; i++ ) {
    console.log( s[i], containsSequentialDigits(s[i]) );
}

输出:

"s" false
"1x2" false
"2x1" false
"13" false
"12" true
"21" true

答案 2 :(得分:0)

最简单的方法是使用简单的连续数字字符串和.indexOf()方法。假设您正在寻找字符串中是否有连续数字而不是它们是什么,最长的连续数字组,或类似的东西(这将需要更多编码:)),那么以下函数将起作用:

function hasConsecutiveDigits(sValue) {
    var sConsecutiveDigits = "012345678909876543210";
    var regDigitPattern = /\d{2,}/g;

    var aDigitGroups = sValue.match(regDigitPattern);

    if (aDigitGroups !== null) {
        for (j = 0; j < aDigitGroups.length; j++) {
            for (x = 0; x < (aDigitGroups[j].length - 1); x++) {
                var sCurrDigits = aDigitGroups[j].substring(x, x + 2);
                if (sConsecutiveDigits.indexOf(sCurrDigits) !== -1) {
                    return true;    
                }
            }
        }
    }

    return false;
}

sConsecutiveDigits字符串包含所有可能的连续数字模式,因此您可以简单地捕获一个或多个数字的任意组(使用regDigitPattern正则表达式值),然后查看是否有任何两位数字这些组的子组作为sConsecutiveDigits字符串的子字符串存在。

此外,因为你只是在寻找&#34;是的,它有连续的数字&#34;或者&#34;不,它没有连续的数字&#34;,你可以在找到匹配后立即退出检查,减少处理。

我使用以下代码测试了该函数:

var aTestData = ["ae12", "aeg12345km", "mea65", "ab2d43a21", "poe09ac", "adsas", "asd13sad", "asda1357sd", "sd4dfg3dfg5df"];

for (i = 0; i < aTestData.length; i++) {
    var result = hasConsecutiveDigits(aTestData[i]);

    console.log("'" + aTestData[i] + "' " + ((result) ? "contains" : "does not contain") + " consecutive digits.")
}

。 。 。并收到以下结果:

'ae12' contains consecutive digits.
'aeg12345km' contains consecutive digits.
'mea65' contains consecutive digits.
'ab2d43a21' contains consecutive digits.
'poe09ac' contains consecutive digits.
'adsas' does not contain consecutive digits.
'asd13sad' does not contain consecutive digits.
'asda1357sd' does not contain consecutive digits.
'sd4dfg3dfg5df' does not contain consecutive digits.

<强>更新

我对我的解决方案进行了一些速度测试,Daniel Böhmer在这里:http://jsperf.com/duplicate-digit-check

长话短说,他们在我测试过的三个热门(IE 9,FF 31和Chrome 40)中的表现非常相似,大多数时候都采用indexOf方法的优势。

我的所有代码都像单个正则表达式检查一样运行,这可以让您了解正则表达式的重要性。它是一个很棒的工具,但它应该被轻轻地使用&#34;。 :)