Проверка регулярным выражением повторяющихся символов

#java #regex

Вопрос:

Мне нужно проверить 5-значный номер с помощью регулярного выражения. Условие проверки: 1. Должно быть не более 2 повторяющихся цифр (тип 11234). 2. Не должно быть последовательности 12345 или 54321. Я пытаюсь сделать следующее: var PASSWORD_PATTERN = "^(?=[\\D]*\\d)(?!.*(\\d)\\1)(?!.*\\2{3,}){5,}.*$" , Но проверка на 12345 или 54321 не работает.

Комментарии:

1.Ты имеешь в виду вот так? ^(?!d*(d)d*1d*1)(?!12345)(?!54321)d{5}$ regex101.com/r/Nh45dx/1

2. являются 23456 09876 ли, или 12121 или 12131 приемлемыми?

3. Пожалуйста, не просто просите нас решить проблему или закодировать решение для вас. Новички приветствуются, но мы ожидаем от вас некоторых усилий, чтобы решить вашу собственную проблему, прежде чем задавать вопрос. Это не бесплатная услуга по кодированию, хотя мы очень рады помочь вам устранить проблемы с вашим написанным кодом. Удачи 🙂

4. Я имею в виду регулярное выражение, исключающее любую прямую или обратную последовательность последовательных цифр

Ответ №1:

Вы можете утверждать не для 3 одинаковых цифр и утверждать не 12345, а 54321.

Обратите внимание, чтобы дважды избежать обратной косой черты в Java \d .

 ^(?!d*(d)d*1d*1)(?!12345)(?!54321)d{5}$
 

Шаблон совпадает:

  • ^ Начало строки
  • (?!d*(d)d*1d*1) Отрицательный внешний вид, не совпадайте 3 раза с одними и теми же цифрами, используя 2 обратные ссылки 1
  • (?!12345) Утверждать не 12345
  • (?!54321) Утверждать не 54322
  • d{5} Совпадение 5 цифр
  • $ Конец строки

Демонстрация регулярных выражений

Или немедленно завершите сопоставление, если строка не состоит из 5 цифр, и сопоставьте 1 цифр, если все утверждения выполнены успешно.

 ^(?=d{5}$)(?!d*(d)d*1d*1)(?!12345)(?!54321)d $
 

Демонстрация регулярных выражений

Если вы не хотите сопоставлять последовательности по возрастанию и убыванию для цифр 0-9, вы можете либо вручную проверить строку для каждой жестко закодированной последовательности, либо сгенерировать последовательности и добавить их в список.

Затем вы можете проверить, есть ли в списке последовательность из 5 цифр, и удалить точную проверку с помощью поисковых запросов из шаблона.

 List<String> sequences = new ArrayList<>();
for (int i = 0; i < 10; i  ) {
    StringBuilder sequence = new StringBuilder();
    int last = i;
    for (int j = 0; j < 5; j  ) {
          last;
        if (last > 9) last = 0;
        sequence.append(last);
    }
    sequences.add(sequence.toString());
    sequences.add(sequence.reverse().toString());
}

String[] strings = {"12345", "54321", "34567", "90123", "112341", "12356", "00132"};

for (String s : strings) {
    if ((!sequences.contains(s)) amp;amp; s.matches("^(?=\d{5}$)(?!\d*(\d)\d*\1\d*\1)\d $")) {
        System.out.printf("%s is not a sequence and does not contain 3 of the same digitsn", s);
    }
}
 

Выход

 12356 is not a sequence and does not contain 3 of the same digits
00132 is not a sequence and does not contain 3 of the same digits
 

Демонстрация Java

Комментарии:

1. Вы можете исключить такие случаи, как 23456 и 09876 использование небольшого количества кода java !"1234567890".contains(pass) amp;amp; !"0987654321".contains(pass)