2011-05-19 3 views
2

Je suis à la recherche d'une chaîne regex qui validera les dates au format aaaaMMjj (pas de délimiteur) et fonctionnera pour les années bissextiles. La chose la plus proche que j'ai trouvé à ce jour ne valide que les dates depuis 2000.regex date de validation pour aaaaMMJJ

import java.util.regex.Pattern; 

public class TestDate { 
    public static final Pattern datePattern = Pattern.compile("** Need RegEx **"); 

    public static void main(String[] args) { 
    System.out.println(datePattern.matcher("19960229").matches()); 
    } 
} 
+12

Avez-vous vraiment * besoin * d'utiliser une regex? Un certainement précis sera incroyablement complexe, vs simplement en utilisant un analyseur de date. –

Répondre

8

Je suggère d'utiliser la java.text.DateFormat comme le montre this page:

public static boolean isValidDateStr(String date) { 
    try { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); 
     sdf.setLenient(false); 
     sdf.parse(date); 
    } 
    catch (ParseException e) { 
     return false; 
    } 
    catch (IllegalArgumentException e) { 
     return false; 
    } 
    return true; 
    } 
2

Je chose en utilisant regex pour ce qui est presque impossible, en raison de la calcul complexe requis pour les années bissextiles. Jon Skeet a raison: utilisez new SimpleDateFormat("yyyyMMdd") pour cela.

1

la regex pour une année bissextile est très complexe: bon exemple: (ce intègre également la vérification de date complète) première section

"(((\\d\\d)(0[48]|[2468][048]|[13579][26])|([02468][048]|[13579][26])(00))(02)([012]\\d))|(\\d\\d([02468][1235679]|[13579][01345789])(02)([01]\\d|2[]))|(\\d\\d\\d\\d((0[13578]|1[02])([012]\\d|3[01])|((0[46]|11)([012]\\d|30))))" 

sépare le cas général avec non se terminant le 00

la deuxième partie traite l'année siècle alors que des années sont de 400 divisible années bissextiles (1900 est pas une année bissextile)

puis dans la dernière section, il gère tous les autres mois

(Je n'ai pas vraiment testé cela mais cela devrait fonctionner assez proche)