Проверка регулярного выражения для чисел с серией шаблонов
У меня есть условие, когда мне нужно пропустить серию чисел с помощью следующего шаблона с использованием JavaScript.
Если 4-значный номер
- Только цифры и длина должны быть 4
- По крайней мере 3 отличных цифры (например, недопустимых цифр: 1113, 4443)
- Нет 3 последовательных цифр как в случае возрастания, так и в порядке убывания (например, недопустимые цифры: 1231, 4321)
Если 5-6 цифр
- Только цифры и длина должны быть 5-6
- По крайней мере 4 различных цифры (например, недопустимых цифр: 11113, 44443)
- Нет 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)
Я не знаю, как заполнить "И НЕ В" в регулярном выражении. Есть ли способ лучше?
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;
}
Я думаю, что последовательный тест цифр гораздо лучше сделать в 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/