Ваш вопрос не ясен.Я предполагаю, что вы хотите 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...