В вашем паттерне вы используете эти положительные взгляды (?=.*\d*)(?=.*[@$!%*#?&£]*)
, где то, что вы хотите утверждать, должно соответствовать 0+ раз цифре или специальному символу с использованием звездочки *
.
Таким образом, утверждение будет верным, если оно есть или нет, что всегда будет верным, давая вам гораздо больше совпадений, чем вы ожидаете.
Вы можете использовать якоря для подтверждения начала ^
и конец $
строки и пропустите *
, чтобы сопоставить его хотя бы 1 раз, чтобы убедиться, что оно там есть.
Отрицательный взгляд за концом (?<![a-zA-Z ])
гарантирует, чтото, что слева - это не символ a-zA-Z или пробел.Вы можете опустить это, не допуская совпадения пробела.
Но применение этого правила не позволило бы сопоставить rese7FwDdvgfe
, но в ваших примерах данных вы действительно хотите сопоставить его, чтобы вы могли исключить внешний вид из шаблона.
^(?=[^a-zA-Z\s]*[a-zA-Z])(?=(?:[^\d\s]*\d|[^\s@$!%*#?&£]*[@$!%*#?&£]))[@$!%*#?&£a-zA-Z\d]{5,20}$
Пояснение
^
Начало строки (?=[^a-zA-Z\s]*[a-zA-Z])
Утверждение верхнего или нижнего регистра az (?=
Позитивный прогноз (?:
Группа без захвата [^\d\s]*\d
Установить цифру |
Или [^\s@$!%*#?&£]*[@$!%*#?&£]
Установить специальный символ
)
Закрыть группу без захвата
)
Закрыть положительный прогноз [@$!%*#?&£a-zA-Z\d]{5,20}
Совпадение всех разрешенных 5 - 20 раз $
Конец строки
Regex demo