Witaj.
Twoje wyrażenie mówi, że nazwa pliku(przed kropką) powinna się składać z wymienionych znaków, a jej długość wynosi 1. Zamiast tego powinieneś ustalić długość "od do" czyli na przykład {1,20} lub, jeśli tak Ci pasuje, znak plusa co oznaczałoby "1 lub więcej".
Idąc dalej stawiasz kropkę, która oznacza dowolny znak - oczywiście chodzi nam konkretnie o kropkę więc powinieneś postawić backslash przed nią.
Jeszcze jedna rzecz - nawiasy okrągłe służą do wyciągania podciągów z tekstu - Ty nie potrzebujesz tego tutaj więc możesz je ominąć.
Dalej jest dobrze. A więc:
preg_match('@^[A-Za-z0-9]{1,20}\.[A-Za-z]{3,4}$@i', $nazwa)
lub
preg_match('@^[A-Za-z0-9]+\.[A-Za-z]{3,4}$@i', $nazwa)
Nie testowałem(ide na żywca

)
Zobacz czy działa.
Pozdrawiam.
PS.
Polecam świetny kurs wyrażeń regularnych
tutaj.