Если вы можете проверить длину отдельно, это может сделать работу: ^(?:[a-zA-Z0-9 .&-]*)?[a-zA-Z]+(?:[a-zA-Z0-9 .&-]*)?$
.Здесь трудно сосчитать, что {5,100}
будет проверять количество вхождений подшаблона, а не общее количество найденных им букв.
объяснение (по порядку):
- начало строки
- может при желании найти любое количество букв / цифр, а ". & -"
- должен найти хотя бы одну букву
- может по выбору найти любое количество букв/ число и ". & -"
- конец строки
пример адаптирован из Генератор кода Regex101 :
const regex = /^(?:[a-zA-Z0-9 .&-]*)?[a-zA-Z]+(?:[a-zA-Z0-9 .&-]*)?$/;
const strs = [
'abcd xyz',
'abcdxyz',
'abcd &',
'abcd1234',
'abcd.xyz.12',
'123456',
'&&&&&&&',
'&&&--..&',
'123 abcd.xyz 777-& !$'
];
let m, i, l = strs.length;
for(i = 0; i < l; i++){
if( (m = strs[i].match(regex)) ){
console.log('Found match: ', m);
}else{
console.log('Doesn\'t match: ', strs[i]);
}
}
ПРИМЕЧАНИЕ : Если вы хотели использовать это для пароля, подобные правила - плохая идея , и теперь официально не рекомендуется