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

  1. #1
    Provisoirement toléré
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Points : 76
    Points
    76
    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 régulier

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

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 37
    Points : 81
    Points
    81
    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.
    Mon entreprise recrute des développeurs C#, n'hésitez pas à me contacter par MP

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 553
    Points : 21 611
    Points
    21 611
    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
    Provisoirement toléré
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Points : 76
    Points
    76
    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 régulier

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

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 37
    Points : 81
    Points
    81
    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
    Mon entreprise recrute des développeurs C#, n'hésitez pas à me contacter par MP

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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
    Provisoirement toléré
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Points : 76
    Points
    76
    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 sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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 régulier

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

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 37
    Points : 81
    Points
    81
    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");
    		}
    	}
    }
    Mon entreprise recrute des développeurs C#, n'hésitez pas à me contacter par MP

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 553
    Points : 21 611
    Points
    21 611
    Par défaut
    Tout ça pour ça alors qu'il suffit d'un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    df.setLenient(false);
    et de vérifier si le parsing est accepté ou lance une exception. Enfin -_-°.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Provisoirement toléré
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Points : 76
    Points
    76
    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