IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Regex les date


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut Regex les date
    salut tout le monde

    je veux bien vérifier le format de la date grâce à un Regex. J'ai essayé pas mal de fois


    voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
     boolean correct = jTextField.getText().matches("^([0-3][0-9][/-.](0[1-9]|1[0-2])[/-.][0-9]{4})$");// date de fin de contrat
     
    					   if (correct==false){
    							 JOptionPane ddd = new JOptionPane();
     ddd.showMessageDialog(null, "Merci de rentrer la date sous le format JJ/MM/AAAA ","ERREUR",JOptionPane.INFORMATION_MESSAGE);					    	 
     
    						}
    J'obtiens un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Exception in thread "AWT-EventQueue-0" java.util.regex.PatternSyntaxException: Illegal character range near index 15
    ^([0-3][0-9][/-.](0[1-9]|1[0-2])[/-.][0-9]{4})$
                   ^


    Merci pour votre aide.

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 37
    Par défaut
    Bonjour,

    Au niveau de ton expression régulière j'aurais plutôt fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ("^(29/02/((19|20)(0[48]|[2468][048]|[13579][26])|2000))|" +
    "(((0[1-9]|1\\d|2[0-8])/(0[1-9]|1[0-2])/)|((29|30)/(0[13-9]|1[0-2])/)|((31/(0[13578]|1[02])/)((19|20)\\d\\d)))$");
    Par ce que dans ton cas tu permets à l'utilisateur d'entrer 39/02/2010 par exemple.
    Concernant l'erreur je jette un coup d'oeil dans la journée.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par minooo Voir le message
    je veux bien vérifier le format de la date grâce à un Regex.
    Cesse. Utilise un DateFormat, tel que SimpleDateFormat, avec setLenient(false).
    Les règles sur les Dates sont trop compliquées pour de simples regex.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      boolean correct = jTextField.getText().matches("^(29/02/((19|20)(0[48]|[2468][048]|[13579][26])|2000))|" +
    					    "(((0[1-9]|1\\d|2[0-8])/(0[1-9]|1[0-2])/)|((29|30)/(0[13-9]|1[0-2])/)|((31/(0[13578]|1[02])/)((19|20)\\d\\d)))$");// date de fin de contrat
     
     
     
    System.out.println(correct );


    ça retourne toujours false si je tappe par exemple 14/02/2010 !!

  5. #5
    Membre éclairé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 37
    Par défaut
    Salut,

    Désolé j'avais pas trop pris le temps depuis vendredi. J'ai fait un petit bout de code rapide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    package test;
     
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    public class Fenetre extends JFrame implements ActionListener {
    	JPanel pan = new JPanel();
    	JButton button = new JButton("Valider");
    	JTextField text = new JTextField();
    	JLabel label = new JLabel();
     
    	public Fenetre() {
    		{
    			this.setTitle("Regex date");
    			this.setSize(200, 150);
    			this.setLocationRelativeTo(null);
    			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    			pan.setLayout(new BorderLayout());
    			button.addActionListener(this);
    			pan.add(text,BorderLayout.NORTH);
    			pan.add(button,BorderLayout.CENTER);
    			pan.add(label,BorderLayout.SOUTH);
    			this.setContentPane(pan);
    			this.setVisible(true);
    		}
    	}
    	public static void main(String[] args){
    		Fenetre fen=new Fenetre();
     
    	}
    	public void actionPerformed(ActionEvent e) {
    		String matche = this.text.getText();
    		Pattern p=Pattern.compile("^(29/02/((19|20)(0[48]|[2468][048]|[13579][26])|2000))|" +
    		"(((0[1-9]|1\\d|2[0-8])/(0[1-9]|1[0-2])/)|((29|30)/(0[13-9]|1[0-2])/)|(31/(0[13578]|1[02]))/((19|20)\\d\\d))$");
    		System.out.println(matche);
    		Matcher m=p.matcher(matche);
    		if (m.matches()){
    			label.setText("Date correct");
    		}
    		else {
    			label.setText("Date incorrect");
    		}
    	}
    }
    Normalement ça fonctionne

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pour revenir à la question intiale:

    . signifie "n'importe quel caractère", il est donc interdit de l'utiliser dans une range, puisque le but de range est de limiter le nombre de caractère
    si vous voulez mettre un . (le caractère point) dans voter range, vous devez l'échapper avec un \ Attention que si vous voulez mettre un \ dans un String, vous devez l'échapper car le \, en plus d'avoir une signification particulière pour les expression régulière a aussi une signification particulière dans les strings pour le compilateur

    Donc on arrive, en rajoutant les parenthèses qui vous manquent autour du OR, à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     boolean correct = jTextField.getText().matches("^[0-3][0-9][/-\\.]((0[1-9])|(1[0-2]))[/-\\.][0-9]{4}$");// date de fin de contrat
    Ca reste une vérification basique et, comme dit par d'autre, le mieux reste de tenter un parsing via dateformat

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut
    mais malheureusement ça fonctionne pas

    est ce que vous avez essayé un exemple d'une date comme 12/10/2011 !!

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    au fait, oublié, faut aussi échapper les tiret, puisqu'il définit un range en expression régulière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("12/10/2011".matches("^[0-3][0-9][/\\-\\.]((0[1-9])|(1[0-2]))[/\\-\\.][0-9]{4}$"));
    renvoie true

  9. #9
    Membre éclairé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 37
    Par défaut
    Citation Envoyé par minooo Voir le message
    mais malheureusement ça fonctionne pas

    est ce que vous avez essayé un exemple d'une date comme 12/10/2011 !!
    Salut,

    Excuse moi, effectivement j'avais peut être été un peu vite.

    Voici le code qui marche ce coup ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    package test;
     
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    public class Fenetre extends JFrame implements ActionListener {
    	JPanel pan = new JPanel();
    	JButton button = new JButton("Valider");
    	JTextField text = new JTextField();
    	JLabel label = new JLabel();
     
    	public Fenetre() {
    		{
    			this.setTitle("Regex date");
    			this.setSize(200, 150);
    			this.setLocationRelativeTo(null);
    			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    			pan.setLayout(new BorderLayout());
    			button.addActionListener(this);
    			pan.add(text,BorderLayout.NORTH);
    			pan.add(button,BorderLayout.CENTER);
    			pan.add(label,BorderLayout.SOUTH);
    			this.setContentPane(pan);
    			this.setVisible(true);
    		}
    	}
    	public static void main(String[] args){
    		Fenetre fen=new Fenetre();
     
    	}
    	public void actionPerformed(ActionEvent e) {
    		String matche = this.text.getText();
    		Pattern p=Pattern.compile("^(29/02/((19|20)(0[48]|[2468][048]|[13579][26])|2000))|(31/(0[13578]|1[02])/(19|20)\\d\\d)|((29|30)/(0[13-9]|1[0-2])/(19|20)\\d\\d)|((0[1-9]|1\\d|2[0-8])/(0[1-9]|1[0-2])/(19|20)\\d\\d)$");
    		System.out.println(matche);
    		Matcher m=p.matcher(matche);
    		if (m.matches()){
    			label.setText("Date correct");
    		}
    		else {
    			label.setText("Date incorrect");
    		}
    	}
    }

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  2. Interbase - dbExpress -> problème avec les dates
    Par marghett dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 03h55
  3. MS Access et TQuery (probleme sur les dates)
    Par Djob dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/06/2004, 14h57
  4. [Interbase] [Access] les dates
    Par AnestheziE dans le forum InterBase
    Réponses: 17
    Dernier message: 26/11/2003, 14h40
  5. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo