Non ho testato bene però potresti provare cosi.

codice:
<input type="text" name="cap" pattern="[0-9]{5}" maxlength="5"
                oninput="this.value = this.value.replace(/[^0-9]/g,'')" required />
Inoltre ricorda che il field deve stare all'interno di un tag form.