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

API standards et tierces Java Discussion :

Problème de regex


Sujet :

API standards et tierces Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 178
    Points : 43
    Points
    43
    Par défaut Problème de regex
    Bonjour;
    Peut-on faire une regular expression avec les chiffres de 1 a 64;j'ai souvent vu la regex "[0-9]" mais jamais une regex au dela de 9 telle que "[1-64]" qui permettrait de filtre en dessous de 1 et au dela de 64.
    je voudrais faire un textfield ou l'on entre que les chiffres de 1 a 64

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Le plus simple serai de faire un test sur la valeur convertie en nombre.

    Cependant, la regex qui match 0 à 64 est la suivante :
    6[0-4]|[1-5][0-9]|[1-9]
    Mais il faut faire attention au "matching", car il faut que ton match soit exactement ce que la personne à saisi et non une sous partie.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Salut,

    La notation [0-9] n'a rien à voir avec le fait de limiter le nombre saisie entre 0 et 9.

    Cela signifie simplement que ta regex va renvoyer faux si tu tapes autre choses que des nombre décimaux.

    Pour ce qui est de limiter le nombre maximal en saisie, il vaut mieux passer par un simple code Java ça sera beaucoup plus simple qu'avec une regex.
    C'est d'ailleurs à mon avis une mauvaise idée de passer par des regex pour faire ce genre de chose ! C'est un peu comme sortir un bazooka pour aller à la chasse au pigeon.

    Si tu peux faire la même chose "facilement" en Java, c'est toujours à privilégier plutôt que de passer par des regex qui peuvent vite être très couteuse en ressources.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try
    {
      if( Integer.valueOf( textField.getText() ) )
        throw new IllegalArgumentException( "Le nombre saisie ne doit pas être supérieur à 64" );
    }
    catch( NumberFormatException e )
    {
      System.out.println( "Le texte saisie n'est pas un nombre " );
    }
    cdt.

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Par contre copie/colle pas le code de Nico02, il est incomplet. C'est juste l'idée de la validation !

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Citation Envoyé par kolodz Voir le message
    Par contre copie/colle pas le code de Nico02, il est incomplet. C'est juste l'idée de la validation !

    Cordialement,
    Patrick Kolodziejczyk.
    Oops j'ai oublier d'écrire la condition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try
    {
      if( Integer.valueOf( textField.getText() ) > 64 )
        throw new IllegalArgumentException( "Le nombre saisie ne doit pas être supérieur à 64" );
    }
    catch( NumberFormatException e )
    {
      System.out.println( "Le texte saisie n'est pas un nombre " );
    }
    Désolé

  6. #6
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Et la condition qui fait que ce n'est pas négatif ?
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  7. #7
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Aussi oui

    Enfin bon il devrait y arriver j’espère

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Une classe de caractères est juste une "selection" de caractères, il n'y a pas de notion d'ordre à l'intérieur. [abcd] est identique à [badc] donc tu ne peux pas représenter un mot ou un nombre à l'intérieur [64] est identique à [46].

    Le tiret dans une classe de caractère sert à définir un rang de caractères successifs dans la table ascii ou unicode et tu peux écrire [0-9] uniquement parce que le zéro est placé avant le neuf dans la table de caractère. De même tu peux très bien écrire [8-=] pour représenter les caractères 8 9 : ; < =, mais pas [=-8] car l'ordre de la table n'est pas respecté.

    Tu peux valider un nombre dans un champ facilement avec du code. Mais si un jour tu es amené à "limiter" une valeur au sein d'une pattern plus grande, le mieux est de regarder le travail du moteur de regex pour le limiter au maximum. Par exemple pour un entier entre 1 et 64, mieux vaut écrire:[1-5][0-9]?|6[0-4]?|[789] en plaçant le cas le plus probable en premier.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 178
    Points : 43
    Points
    43
    Par défaut
    merci pour vos idées

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Et plus important : 64 n'est pas un chiffre.
    0,1,2,3,4,5,6,7,8 et 9 sont des chiffres. Rien d'autre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Bonjour,
    On va faire simple. Voilà la réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    String regExpr = "([0-5]?[0-9])|(6[0-4])";
    "2".matches(regExpr);
    "02".matches(regExpr);
    "50".matches(regExpr);
    "59".matches(regExpr);
    "60".matches(regExpr);
    "64".matches(regExpr);
    "65".matches(regExpr);
    "70".matches(regExpr);
    Testez ce code et vous obtiendrez : true, true, true, true, true, true, false, false
    Donc contrairement à ce qui vous a été dit, [0-5] limite bien les chiffres de 0 à 5 inclu.
    Tous les nombres décimaux entiers positifs inférieurs à 65 s'écrivent littéralement avec 2 caractères. Donc, cette expression régulière admet deux cas :
    Toutes les expressions chaîne constituées de d'un ou deux caractères avec pour premier caractère un chiffre compris entre 0 et 5 inclu et un second caractère représentant un chiffre compris entre 0 et 9 inclu, ou toutes les expressions constituées de deux caractère (pour les nombres compris entre 60 et 64 il y a deux caractères forcément) avec pour premier caractère un 6 et suivi d'un chiffre compris entre 0 et 4.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hum, merci pour cette regex. Elle est meilleure que celle déjà donnée qui marche aussi...

    Citation Envoyé par yotta Voir le message
    Donc contrairement à ce qui vous a été dit, [0-5] limite bien les chiffres de 0 à 5 inclu.
    J'ai pas le souvenir que quelqu'un ait dit ça. Il a été dit que ça n'a rien à voir avec des nombres, il a jamais été question de chiffres.
    C'était dit bien sûr par opposition à l'idée que [1-64] puisse accepter tous les nombres de 1 à 64, ce qui n'est bien sûr pas le cas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Certes, mais dans ce cas, on peut tergiverser longtemps. En effet, 8 est un chiffre, mais c'est aussi un nombre.............
    C'est pourquoi dans mes explications, pour lever toute ambiguïté je parle essentiellement de caractères.
    En fait, dans l'expression [0-9], il ne faut pas interpréter les caractères '0' et '9' comme étant des nombres ni même des chiffres, ce sont des "symboles". La syntaxe des expressions régulières appliquée ici permet donc de définir une plage d'appartenance pour un caractère, cette plage étant définie parmi les caractères représentant tous les chiffres de 0 à 9.
    C'est ce que veut dire Nico02, mais comme il le dit, cela porte à confusion à mon sens et peut faire penser à quelqu'un qui découvre le monde des expressions régulières que cette notation est figée et ne s'utilise qu'ainsi [0-9] et fournit simplement un moyen de déterminer l'appartenance d'un caractère à la famille des chiffres.
    C'est tout, je ne voulais froisser personne.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  14. #14
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par yotta Voir le message
    C'est tout, je ne voulais froisser personne.
    Nan mais c'est pas une question de froisser . C'est une question d'informations incorrectes, en disant que d'autres informations étaient incorrectes alors qu'elles ne l'étaient pas et n'étaient pas non plus ambiguës.
    Il ne faudrait pas que quelqu'un vienne et se dise "ah mais alors ça c'était faux, je ne dois pas faire l'erreur." Euh. Non, c'était pas faux, c'était bien expliqué et tout.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [Java] Problème de Regex
    Par spk4ever dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 28/08/2006, 10h51
  2. Problème avec Regex
    Par trihanhcie dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/07/2006, 14h50
  3. problème de regex
    Par lanfeust42 dans le forum Langage
    Réponses: 11
    Dernier message: 12/07/2006, 15h32
  4. Problème avec RegEx et une Query string
    Par Erakis dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 15h48
  5. Problème de Regex ... avec un point
    Par bugalood dans le forum Langage
    Réponses: 2
    Dernier message: 29/05/2005, 10h26

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