Originariamente inviato da Braco
Funziona perchè di prima dici che con dei numeri risponde, c'è da sistemare la reg. fai una cosa, per le prove usa questo:

var re5digit = new RegExp("^([1-31]+)$"); e guarda il link che ti ho postato, modifica la reg, modifica solo ciò che è nelle parentesi quadre.
dubito fortemente che [1-31] sia l'intervallo da 1 a 31: [1-31] matcha al massimo 1, 2 oppure 3.

scrivi così:
codice:
function checkdata(){

    var re5digit=/^(0[1-9]|[12]\d|3[01])\/(0[1-9]|1[012])\/(19|20|21)\d{2}$/;
    data = document.forms["item1"].starting_date;

    if (!re5digit.test(data.value)) {
      alert("Please enter a valid data");
      data.focus();
      return false;
   }
}
quell'espressione regolare controlla già intrinsecamente la lunghezza e il fatto che il campo non sia vuoto
Occhio all'escape delle slash in avanti e all'apice e al dollaro che delimitano la regexp.