Non ho testato bene però potresti provare cosi.



<input type="text" name="cap" pattern="[0-9]{5}" maxlength="5"
oninput="this.value = this.value.replace(/[^0-9]/g,'')" required...