Регулярное выражение с запретом на повторение подряд идущих символов
Пытаюсь создать регулярное выражение, валидирующее следующие требования:
- Возможно одновременное использование кириллицы и цифр (без пробелов и спец. символов)
- Возможно одновременное использование латиницы и цифр (без пробелов и спец. символов)
- Невозможно одновременное использование кириллицы и латиницы
- Первая буква должна быть заглавной, не может быть цифрой
- Невозможно использование 3 и более одинаковых символов подряд
- Длина последовательности - от 2 до 16 цифр включительно
Прошу помощи по мере ваших сил, перепробовал несколько вариантов с просторов сети, сам не справился.
Ответы (1 шт):
Перенесу шаблон из комментария в ответ:
(?!.*(.)\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: забыл про символ окончания строки - $ его нужно поставить в конце шаблона