В регулярных выражениях нет оператора «и», этот оператор заменяется опережающими и ретроспективными проверками, которые реализованы не везде. Данная задача так же может быть решена с использованием if:then:else в виде (?(n)то|иначе). Если группа n вернула совпадение выполнить «то», если совпадения нет — выполнить «иначе».
Насколько я помню данный функционал тоже не был реализован.
Соответственно, если у нас нет проверок, нужно писать обычную регулярку, которая через или будет учитывать все варианты.
Основная идея в том, что нужно искать букву и цифру разделенные спецсимволами.
Рассмотрим самый простой случай, когда цифра и буква не разделены спец.символом.
Для удобства обозначим все допустимые символы за \q, а все специальные символы за \e
тогда для такого набора можно записать регулярку вида(каждая строка это или):
(?:[a-zA-Z]\d|\d[a-zA-Z])\q{4,8} — пароль начинается с цифры потом буквы или наоборот
\q(?:[a-zA-Z]\d|\d[a-zA-Z])\q{3,7} — первое вхождение цифры с буквой на позиции 2
\q{2}(?:[a-zA-Z]\d|\d[a-zA-Z])\q{2,6}
\q{3}(?:[a-zA-Z]\d|\d[a-zA-Z])\q{1,5}
\q{4}(?:[a-zA-Z]\d|\d[a-zA-Z])\q{0,4}
\q{5}(?:[a-zA-Z]\d|\d[a-zA-Z])\q{0,3}
\q{6}(?:[a-zA-Z]\d|\d[a-zA-Z])\q{0,2}
\q{7}(?:[a-zA-Z]\d|\d[a-zA-Z])\q?
\q{8}(?:[a-zA-Z]\d|\d[a-zA-Z]) — 8 вариантов
в случае с одним спец символом между:
(?:[a-zA-Z]\e\d|\d\e[a-zA-Z])\q{3,7}
…
\q{7}(?:[a-zA-Z]\e\d|\d\e[a-zA-Z]) — 7 вариантов
и т.д. простая арифметика показывает, что всего «больших или» будет (8+1)*4 = 36. Не идеально, но куда лучше полного перебора. Думаю в данном регулярном выражении будет много повторяющихся частей, которые тоже можно будет свернуть.
Насколько я помню данный функционал тоже не был реализован.
Соответственно, если у нас нет проверок, нужно писать обычную регулярку, которая через или будет учитывать все варианты.
Основная идея в том, что нужно искать букву и цифру разделенные спецсимволами.
Рассмотрим самый простой случай, когда цифра и буква не разделены спец.символом.
Для удобства обозначим все допустимые символы за \q, а все специальные символы за \e
тогда для такого набора можно записать регулярку вида(каждая строка это или):
(?:[a-zA-Z]\d|\d[a-zA-Z])\q{4,8} — пароль начинается с цифры потом буквы или наоборот
\q(?:[a-zA-Z]\d|\d[a-zA-Z])\q{3,7} — первое вхождение цифры с буквой на позиции 2
\q{2}(?:[a-zA-Z]\d|\d[a-zA-Z])\q{2,6}
\q{3}(?:[a-zA-Z]\d|\d[a-zA-Z])\q{1,5}
\q{4}(?:[a-zA-Z]\d|\d[a-zA-Z])\q{0,4}
\q{5}(?:[a-zA-Z]\d|\d[a-zA-Z])\q{0,3}
\q{6}(?:[a-zA-Z]\d|\d[a-zA-Z])\q{0,2}
\q{7}(?:[a-zA-Z]\d|\d[a-zA-Z])\q?
\q{8}(?:[a-zA-Z]\d|\d[a-zA-Z]) — 8 вариантов
в случае с одним спец символом между:
(?:[a-zA-Z]\e\d|\d\e[a-zA-Z])\q{3,7}
…
\q{7}(?:[a-zA-Z]\e\d|\d\e[a-zA-Z]) — 7 вариантов
и т.д. простая арифметика показывает, что всего «больших или» будет (8+1)*4 = 36. Не идеально, но куда лучше полного перебора. Думаю в данном регулярном выражении будет много повторяющихся частей, которые тоже можно будет свернуть.