• Помогите правильно составить регулярное выражение для org.apache.regexp.re

    В регулярных выражениях нет оператора «и», этот оператор заменяется опережающими и ретроспективными проверками, которые реализованы не везде. Данная задача так же может быть решена с использованием 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. Не идеально, но куда лучше полного перебора. Думаю в данном регулярном выражении будет много повторяющихся частей, которые тоже можно будет свернуть.