2016-11-01 2 views
0

Предположим, у меня есть 5 условий, которые я проверяю с помощью lookahead. Я буду называть ихСоответствует некоторым условиям регулярного выражения (3 из 5)

a, b, c, d, e 

Это будет мое регулярное выражение:

^(?=.*[a])(?=.*[b])(?=.*[c])(?=.*[d])(?=.*[e]).*$ 

regex101 - test

это будет соответствовать всем перестановку, б, в, д, е, но я хочу, чтобы соответствовать по крайней мере 3 из 5 (не эксклюзивный как 'HVD' указал)

Значение этого будет проходить:

abc 
abcde 
abbbbbe 
abccee 
cddbbbbbeee 

Но это будет не

aaaaa 
bbbaaaaa 

EDIT: Реальное использование для пароля политики - 5 условий (нижний регистр, верхний регистр, специальный полукокса, номер и т.д.), вы должны соблюдать х из у.

Это легко сделать в коде, но это теоретический вопрос для ограничения границ регулярного выражения.

+0

Я думаю, у вас есть два варианта: 1) сопоставить каждую перестановку 3 из 5 или 2) захватить совпадения и проверить код, если 3 группы захвата имеют данные. –

+0

«это будет соответствовать всей перестановке a, b, c, d, e» - не только. Он с радостью сообщит о матче на 'abcdef'. – hvd

+0

Вы можете комбинировать их с помощью оператора 'OR' или использовать подпрограммы, если они поддерживаются вашим вкусом. – Jan

ответ

1

/^(?:(?=.*[a])(?:(?=.*[b])(?=.*(?:[c]|[d]|[e]))|(?=.*[c])(?=.*(?:[d]|[e])))|(?=.*[d])(?=.*[e])|(?=.*[b])(?:(?=.*[c])(?=.*[d])|(?=.*([c]|[d]))(?=.*[e]))|(?=.*[c])(?=.*[d])(?=.*[e])).*$/gm

В основном это имеет все перестановки из 5 возможных моделей (но оптимизирован бит для кода длины).

Жесткий, чтобы быть на 100% уверенным, что он работает правильно, но я думаю, что у меня его там очень много. ^^

+0

Я не могу спорить с результатами. Только для усилий он заслуживает принятого ответа. EDIT: Он также соответствует 'de', хотя он удовлетворяет только двум условиям, но достаточно близко. Я уверен, что 100% регулярное выражение не способ пойти. – Zikato