1

javascript を使用して、次のパターンで一連の数字を省略しなければならない状況があります。

4桁の数字の場合

  1. 数値と長さのみ 4 にする必要があります
  2. 少なくとも 3 つの異なる数字 (例: 許可されていない数字: 1113、4443)
  3. 昇順および降順の系列の場合、3 桁の連続する数字はありません (例: 許可されていない数字: 1231、4321)

5~6桁の数字の場合

  1. 数字と長さのみ 5 ~ 6 にする必要があります
  2. 少なくとも 4 つの異なる数字 (例: 許可されていない数字: 11113、44443)
  3. 昇順および降順の系列の場合、連続する 3 桁はありません (例: 許可されていない桁: 12341、43211)

私の知る限り、昇順と降順を確認することはできません。

4桁の場合

^[0-9]{4}$ AND NOT IN
(?:012|210|123|321|234|432|345|543|456|654|567|765|678|876|789|987|111|222|333|444)

5~6桁の場合

^[0-9]{5,6}$ AND NOT IN
(?:0123|3210|1234|4321|2345|5432|3456|6543|4567|7654|5678|8765|6789|9876|1111|2222|3333|4444|5555|6666)

「AND NOT IN」を正規表現で埋める方法がわかりません。より良い方法はありますか?

4

2 に答える 2

2

この種のことは、正規表現としては複雑すぎるように思えます。たとえそれを書くことができたとしても、たくさんのコメントなしでそれを理解できるでしょうか?

代わりに、それを分解してみてください。

// assuming var number as string;
var i, l = number.length, prev = -999, dist, prevdist = 0,
    digits = [0,0,0,0,0,0,0,0,0,0], dcnt = 0;
main:
switch(l) {
case 4:
case 5:
case 6:
    for( i=0; i<l; i++) {
        digits[number[i]]++;
        dist = prev-number[i];
        if( prevdist == dist && Math.abs(dist) == 1) {
            alert("Three consecutive digits ("+number.substr(i-2,3)+")");
            break main;
        }
        prev = number[i];
        prevdist = dist;
    }
    for( i=0; i<10; i++) {
        if( digits[i]) dcnt++;
    }
    if( dcnt < (l == 4 ? 3 : 4)) {
        alert("Need at least "+(l == 4 ? 3 : 4)+" distinct digits");
        break main;
    }
    alert("Valid");
    break main;
default:
    alert("Length must be between 3 and 5");
    break main;
}
于 2012-10-05T15:54:17.213 に答える
1

連続した数字のテストは、javascript で行う方がはるかに優れていると思います。以下は、連続した数字の上下のシーケンスをテストする関数です。テストする数を渡します。

function checkConsecutiveChars(str, limit) {
    var lastDigit = str.charCodeAt(0), num = 1, val, delta;
    for (var i = 1; i < str.length; i++) {
        val = str.charCodeAt(i);
        ++num;
        if (num === 2) {
            // calc delta and remember it
            delta = val - lastDigit;
            // see if we have a two char sequence now
            if (Math.abs(delta) !== 1) {
                // not sequential, start over
                num = 1;
            }
        } else {
            // see if consecutive sequence continues and exceeds limit
            if (val === (lastDigit + delta)) {
                if (num >= limit) {
                    return(false);
                }
            } else {
                // sequence stopped
                num = 1;
            }
        }
        lastDigit = val;
    }
    return(true);
}

作業例: http://jsfiddle.net/jfriend00/Nym8Y/


この関数を使用して、一意の数字がいくつあるかを確認できます。

function checkDistinctDigits(str, minDistinct) {
    var digits = new Array(10);
    var uniqueCnt = 0, val;
    for (var i = 0; i < str.length; i++) {
        val = str.charCodeAt(i);
        if (val >= 48 && val <= 57) {
            if (!digits[val - 48]) {
                ++ uniqueCnt;
                digits[val - 48] = true;
            }
        }
    }
    return(uniqueCnt >= minDistinct);
}

作業例: http://jsfiddle.net/jfriend00/cpXnW/

于 2012-10-05T16:12:32.613 に答える