Jeśli chciałbyś to zrobić tylko regexp to będzie to nieco bardziej skomplikowane:
const reg = /^(?=.*[a-z])(?=.*\d)[a-z\d]{4,6}$/i
reg.test('kot3k'); //true
reg.test('kotek'); //false
reg.test('1aaa'); //true
reg.test('1aaaaa'); //true
reg.test('1aaaaaa'); //false
reg.test('12345'); //false
reg.test('1234a'); //true
Caly problem polega na tym, aby umożliwić dowolną lokalizację cyfry i liter, dlatego nie możesz zrobić regexp typu [a-z]\d, bo wymuszalbyś najpierw literę, a potem cyfrę, Ty natomiast nie podałeś takich warunków, więc regexp musi być elastyczny.
Jeśli jednak nie masz doświadczenia z regexp to polecałbym zwalidować to w osobnych krokach, czyli np:
/^[a-z\d]{4,6}$/.test(value); //test długości i dopuszczalnych znaków
/\d+/.test(value); //test czy jest min. jedna cyfra
/[a-z]/i.test(value); //test czy jest litera
co więcej, zapis A-z jest błędny, a przynajmniej prawdopodobnie błędny bo nie oznacza zakresu liter A-Za-z, ale bierze też znaki pośrednie - zobacz sobie w tablicę ASCI co tam siedzi między tymi literami :) Dlatego lepiej zapisać [a-z] i dodać flagę "i".
W drugim przykładzie robimy tak, że najpierw badamy czy w ogóle cały ciag sklada się jedynie z dozwolonych znaków w ilości od 4 do 6, a dopiero potem testujemy istnienie poszczególnych wymaganych znaków (bo pierwszy test przejdzie np. dla 12345 czy abcde, i dopiero drugi i trzeci wyłapią tu błąd walidacji).