Нет повторяющейся последовательности в SSN (например, 123-12-3123) - PullRequest
2 голосов
/ 26 апреля 2011

Как бы вы исключили повторение последовательности для SSN через регулярное выражение?

Например, следующие значения будут запрещены:

    123-12-3123
    456-45-6456
    789-78-9789

ОБНОВЛЕНИЕ

Что представляет собой повторение? * Имеет ли значение * 121-233-4444?

Хороший вопрос, но нет;по крайней мере пока.Я код-обезьяна, заполняющая запрос от A & D, который, в свою очередь, выполняет запрос от клиента.

Они специально запрашивают исправление, чтобы пользователи не могли вводить последовательность из 3 чисел, повторяющихся 3 раза.Наиболее распространенными являются перечисленные выше.

Какой язык вы используете?

javascript

Также яЯ добавляю это регулярное выражение в существующий REGEX, который похоронен глубоко в приложении уровня предприятия с тысячами пользователей.Добавление кода возможно, но совсем не желательно.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Ваш вопрос не ясен.Я предполагаю, что вы хотите xyz-xy-zxyz, где x+1 = y и y+1 = z.

Нет хорошего ответа.

Грубая сила:

/
   ^
   (?: 012-01-2012
   |   123-12-3123
   |   234-23-4234
   |   345-34-5345
   |   456-45-6456
   |   567-56-7567
   |   678-67-8678
   |   789-78-9789
   )
   \z
/x

Выше можетбыть построенным динамически:

my @alts;
for (0..7) {
   my ($x, $y, $z) = ($_+0, $_+1, $_+2);
   push @alts, "$x$y$z-$x$y-$z$x$y$z";
}

my $alt = join('|', @alts);

/^(?:$alt)\z/

Нет необходимости проверять, поэтому можно использовать:

/
   ^
   (?: 01-?2-? | 12-?3-? | 23-?4-? | 34-?5-?
   |   45-?6-? | 56-?7-? | 67-?8-? | 78-?9-?
   ){3}
   \z
/x

Если ваш язык программирования имеет возможность встраивания кода:

/
   ^
   ( [0-7] )
   ( (??{ $1+1 }) )
   ( (??{ $1+2 }) )
   -
   \1 \2
   -
   \3 \1 \2 \3
   \z
/x

Вы можете расширить свою сеть:

/
   ^
   ( [0-9] )( [0-9] )( [0-9] )
   -
   \1 \2
   -
   \3 \1 \2 \3
   \z
/x

Если вы не хотите расширять свою сеть, вы также можете использовать код вне регулярного выражения:

/
   ^
   ( [0-7] )
   ( [1-8] )
   ( [1-9] )
   -
   \1 \2
   -
   \3 \1 \2 \3
   \z
/x && $2 == $1+1 && $3 == $2+1

И затемвот что:

s/-//g;
/
   ^
   (?: 012 | 123 | 234 | 345
   |   456 | 567 | 678 | 789
   ){3}
   \z
/x

Для простоты я настоятельно рекомендую перед выполнением проверки удалить нецифровые символы.

/^[0-9]{3}-[0-9]{2}-[0-9]{4}\z/
   or die;

s/-//g;

... check here...
0 голосов
/ 27 апреля 2011

Сначала удалите нецифровые символы:

$ssn =~ s/\D+//g;

Затем проверьте наличие повторяющихся групп из трех цифр:

if ($ssn =~ /(\d{3})\1\1/) {
  print "ssn has repeating digits: $1\n";
}
...