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

Langage Java Discussion :

Expression régulière : exclure des valeurs numériques


Sujet :

Langage Java

  1. #1
    Expert éminent sénior
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3 020
    Points : 16 092
    Points
    16 092
    Par défaut Expression régulière : exclure des valeurs numériques
    Bonjour,

    je me prends la tête sur une expression régulière pour ne pas matcher certaines valeurs numériques.

    Mon entrée est un numérique d'un ou deux digits (de 1 à 99 donc).

    Je dois exclure les valeurs 5, 9 et 10.

    Après pas mal de tests, j'ai testé cette regexp :

    ^(?!5|9|10).*$

    Ça rejette bien 5, 9 et 10.

    Sauf que cela rejette aussi les nombres à deux chiffres qui contiennent un 5 ou un 9 comme 56 ou 45 ou 39.

    Comment puis-je préciser sur ce sont des valeurs "exactes"?

  2. #2
    Membre régulier Avatar de abdennour bouaicha
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 98
    Points : 112
    Points
    112
    Par défaut
    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
     
     
    import java.util.Scanner;
     
    public class exp {
     
        public static void main( String[] args ) {
            String s = "";
            while ( true ) {
     
                Scanner k = new Scanner( System.in );
                System.out.println( "Introduire une chaine :" );
                s = k.nextLine();
                String res = "";
                if ( s.matches( "[1-90]{1,2}" ) && !s.matches( "5" ) && !s.matches( "9" ) && !s.matches( "10" ) )
                    res = s + "est juste";
                else
                    res = s + "est faux";
                System.out.println( res + "\n" );
            }
     
        }
     
    }

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    A quoi ça sert de tester un nombre avec une expression régulière. Si c'est un nombre, tester un nombre. Éventuellement convertir la chaîne en nombre si c'est ce qu'on a en entrée. Si le nombre est au milieu d'un texte, on peut l'extraire.

    Citation Envoyé par abdennour bouaicha Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
                if ( s.matches( "[1-90]{1,2}" ) && !s.matches( "5" ) && !s.matches( "9" ) && !s.matches( "10" ) )
    On peut chercher à faire le truc en expression régulière à la limite, mais si c'est pour avoir 4 expressions, dont trois peuvent être résolues par "equals", c'est n'importe quoi.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    On peut s'approcher le problème avec le pattern par énumération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^([0-4]|[6-8]|[2-9][0-9]|[1][1-9])$
    Est-ce en quelque sorte méritant ? je ne sais pas.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3 020
    Points : 16 092
    Points
    16 092
    Par défaut
    Bonjour,

    merci pour vos réponses.


    @abdennour bouaicha : cela ne réponds pas à ma demande, je dois avoir une seule expression!

    @joel.drigo : je n'ai sans doute pas donné suffisament de contexte, parce que tu aurais raison dans beaucoup de cas, mais je suis sur une architecture particulière que je ne peux pas modifier et qui est basée sur les expressions régulières, j'ai donc bien besoin d'une seule et unique expression régulière. Mais je te l'accorde, c'est moche.


    @tsuji : merci, parce que ça marche, et c'est une approche intéressante, mais je trouve que c'est difficile à lire et comprendre, du coup, j'ai continué à chercher, et j'ai fini par trouver une expression permettant de lister les valeurs à exclure :



    ^(?!^5$|^9$|^10$).*$

    Je suis un peu embêté par le .* puisque * veut dire 1 ou plusieurs fois, mais dans mon cas précis, ou je n'ai qu'un seul nombre, cela fait l'affaire.

    Merci à tous pour vos remarques et réponses! Résolu.

  6. #6
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    On doit tout de même beaucoup serrer l'écriture de regex pourqu'elle matche exactement ce qu'on veut matcher ou rejeter. Si je garde les mêmes critères originaux, on peut l'écrire comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(?!^5$|^9$|^10$)\d{1,2}$
    (avec bien-entendu \ dédoublé dans le string java.)

    Pour une approache que j'ai montré, c'est parfois bien appropriée: comme par exemple les digits d'une date avec limitations 06-30, 07-31, 08-31 etc. Et je passe. Si on prend l'habitude, on peut lire une regex comme une prose (j'exagère) - compliquée ou pas, souvent c'est relative.

    édition
    Et bien reste, qu'elle matche aussi "00", "01" etc. si ça ne gène personne.

  7. #7
    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 des trois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ^[1-9]\d?$(?<!^[59]|10)          # on teste d abord la longueur puis on vérifie ensuite les valeurs à exclure
    ^(?![59]$|10)[1-9]\d?$           # on vérifie en premier les valeurs à exclure, puis on teste la longueur
    ^(?:[234678]\d?|[59]\d|1[1-9]?)$ # on décrit uniquement ce que l on cherche
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. Exclure des valeurs d'une sélection dans une expression
    Par Seth_Nemesia111 dans le forum QlikView
    Réponses: 3
    Dernier message: 30/03/2015, 13h43
  2. Trouver une expression régulière pour les valeurs des noeuds XML
    Par Motin dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 05/10/2011, 17h51
  3. souci avec le format des valeurs numériques.
    Par LESOLEIL dans le forum Langage
    Réponses: 9
    Dernier message: 05/04/2006, 16h12
  4. Trier une colonne avec des valeurs numériques ou textes
    Par jfc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/02/2006, 11h15
  5. [xslt] filtrer des valeurs numériques
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/09/2005, 12h01

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