RegEx, чтобы проверить, все ли цифры в номере одинаковы или в последовательности - PullRequest
7 голосов
/ 29 июля 2011

Я хочу проверить, введен ли пользователь на стороне сервера.Если пользователь вводит число 111111 или 22222 с такими же номерами, а также если последовательность введена в последовательности, например 12345 или 456789.

Ответы [ 3 ]

13 голосов
/ 29 июля 2011

Для сопоставления последовательных одинаковых цифр:

^([0-9])\1*$

Обратите внимание, что вы должны избегать обратной косой черты, когда помещаете ее в строковый литерал Java, например, "^([0-9])\\1*$".

Для второго вы должны явно составить список последовательных цифр, используя оператор |. Регулярное выражение будет очень длинным и неприятным с 10 вложенными паратезами. Нужно сгенерировать это регулярное выражение с помощью программы. Другими словами, это неправильная проблема для решения с помощью регулярных выражений. Было бы намного проще написать цикл и проверить это.

3 голосов
/ 29 июля 2011

Этот шаблон будет соответствовать, если пользователь введет ту же цифру:

^(\d)\1*$

\1 соответствует первой группе захвата, поэтому шаблон соответствует повторению этой первой цифры для всей строки.

Вторая проблема (последовательные цифры) несколько сложнее.

^(?:^(?:^(?:^(?:^0?1)?2)?3)4?)?5(?:$|6(?:$|7(?:$|8(?:$|90?))))$|
    ^(0?1)?2(?:$|3(?:$|4))|^(6?7)?8(?:$|90?)$

- это одна реализация, предполагающая три или более цифр. Но так как количество комбинаций невелико, также возможно перечисление (4+ цифры):

^(?:0?123(45?)?|1?23456?|2?34567?|3?45678?|4?56789?|(5?6)?7890?|
         (0?1)?2345678?(90$)?|1?23456789?|2?345678(90?)?)$

Все это говорит о том, что регулярные выражения не всегда хорошо работают для такого рода проблем. Метод Java для проверки этой последовательности может быть чище.

1 голос
/ 23 октября 2015

На этот раз в Perl, объяснить второй случай проще:

perl -nlE 'say "BAD number" if ($_ =~ /^(\d)\1*$/ or "123456789" =~ /$_/)'

Пояснение:

  • вариант 1: ввод ∈ /(\d)\1*/ язык: уже представлен ($_ =~ /^(\d)\1*$/)
  • case 2: строка «123456789» соответствует вводу ("123456789" =~ /$_/)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...