Регулярное выражение с запретом на повторение подряд идущих символов

Пытаюсь создать регулярное выражение, валидирующее следующие требования:

  • Возможно одновременное использование кириллицы и цифр (без пробелов и спец. символов)
  • Возможно одновременное использование латиницы и цифр (без пробелов и спец. символов)
  • Невозможно одновременное использование кириллицы и латиницы
  • Первая буква должна быть заглавной, не может быть цифрой
  • Невозможно использование 3 и более одинаковых символов подряд
  • Длина последовательности - от 2 до 16 цифр включительно

Прошу помощи по мере ваших сил, перепробовал несколько вариантов с просторов сети, сам не справился.


Ответы (1 шт):

Автор решения: PotroNik

Перенесу шаблон из комментария в ответ:

(?!.*(.)\1\1)^(?:[A-Z][A-Za-z0-9]{1,15}|[А-ЯЁ][А-ЯЁа-яё0-9]{1,15})

Рассмотрим его по частям, сначала первую группу:
(?!.*(.)\1\1) где ?! - означает негативный просмотр вперед и в случае, если мы видим в строке соответствие указанному шаблону в группе, захват не происходит.
Сам шаблон выглядит так:
.* - ноль и более любых символов
(.) - обычная группа захвата (не омон конечно) она будет пронумерована как первая, в которую мы помещаем один любой символ
Подставляем символы захваченные в группу \1\1, т.е. ели подряд идут 3 и более символа мы их захватываем шаблоном, а негативная группа исключает данную строку


^ - эта шляпа означает символ начала строки


Вторая группа: (?:[A-Z][A-Za-z0-9]{1,15}|[А-Я][А-ЯЁа-яё0-9]{1,15})
?: - говорит о том что группа не захватывается и мы не сможем ее вызвать далее
[A-Z] - Одна заглавная буква латинского алфавита в диапазоне от A до Z
[A-Za-z0-9]{1,15} - диапазон латинских букв в любом регистре и диапазон цифр не менее одной, не более 15, с первой заглавной буквой получается от 2 до 16 символов
| - означает или, т.е. у нас строка или как описано выше или как описано ниже
[А-Я] - аналогично латинской группе, только на кирилице, кстати да, в диапазон А-Я не входит буква Ё ее нужно прописывать отдельно [А-ЯЁ] [А-ЯЁа-яё0-9]{1,15} - аналогично группе с латинскими буквами и цифрами, только кириллица.

UPD: забыл про символ окончания строки - $ его нужно поставить в конце шаблона

→ Ссылка