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

Langages de programmation Discussion :

Expression régulière RegExp


Sujet :

Langages de programmation

  1. #1
    Membre du Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Points : 64
    Points
    64
    Par défaut Expression régulière RegExp
    Bonjour,

    je bloque sur l'expression régulière : entier positif inférieur à 256.

    J'ai réussi à faire de 0 à 255, mais je n'arrive pas a exclure le 0.

    [10]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]

    Merci pour votre aide.

  2. #2
    Candidat au Club Avatar de lizia
    Femme Profil pro
    Etudiante en L2 Informatique
    Inscrit en
    Août 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Etudiante en L2 Informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2017
    Messages : 1
    Points : 3
    Points
    3
    Par défaut
    Bonjour

    J'ai testé ton expression et ce n'était pas trop mal mais je la trouve tout de même trop permissive.
    Tu ne récupères pas de manière exacte un chiffre en 0 et 255, cela récupère des portions de numéro qui sont dans la limitation choisie, et c'est pourquoi le zéro est également accepté.

    Je m'explique : avec le caractère ? tu rends optionnel le [10] et tu as fait suivre cela de [0-9]{1,2}, ce qui fait qu'en application : un nombre du type 0 est valide car ton ensemble de caractères est compris entre [0-9] et ait répété une OU deux fois. 0 respectant bien les limites ça passe.

    C'est une idée de départ libre à toi de modifier et d'adapter cela selon tes besoins mais j'ai fait une expression régulière : ^([1-9]|0?[1-9][0-9]?|2[0-5]{2}|1[0-9]{2})$
    Cette expression accepte les nombres de 1 à 255 et ceux en plusieurs formats : 01 011 111 025 255 mais le zéro n'est pas accepté ni le format en 001 il suffit de le rajouter si besoin est.

    J'espère avoir pu aider !

  3. #3
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 109
    Points
    6 109
    Par défaut
    Bonjour,

    Citation Envoyé par lizia Voir le message
    ^([1-9]|0?[1-9][0-9]?|2[0-5]{2}|1[0-9]{2})$
    Cette expression accepte les nombres de 1 à 255 et ceux en plusieurs formats : 01 011 111 025 255 mais le zéro n'est pas accepté ni le format en 001 il suffit de le rajouter si besoin est.
    Ton expression régulière n'accepte pas tous les nombres entre 1 et 255. Par exemple, elle refuse 206.

    En effet, si je lance le programme Python suivant :
    Code Python : 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
    import re
     
    regex_0_255 = re.compile('^([1-9]|0?[1-9][0-9]?|2[0-5]{2}|1[0-9]{2})$')
     
    exhaustive_expected_matches = map(str, range(0, 256))
     
    some_expected_mismatches = (
        *map(str, range(256, 1000)),
        *map(lambda n: '0' + str(n), range(0, 1000))
    )
     
    bad_mismatches = tuple(filter(lambda s: regex_0_255.match(s) is None, exhaustive_expected_matches))
    bad_matches    = tuple(filter(lambda s: regex_0_255.match(s) is not None, some_expected_mismatches))
     
    if bad_mismatches:
        print(f'The following strings should match but they do not: {", ".join(bad_mismatches)}.')
    if bad_matches:
        print(f'The following strings should not match but they do: {", ".join(bad_matches)}.')
    if not(bad_mismatches) and not(bad_matches):
        print('OK')
    Cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    The following strings should match but they do not: 0, 206, 207, 208, 209, 216, 217, 218, 219, 226, 227, 228, 229, 236, 237, 238, 239, 246, 247, 248, 249.
    The following strings should not match but they do: 01, 02, 03, 04, 05, 06, 07, 08, 09, 010, 011, 012, 013, 014, 015, 016, 017, 018, 019, 020, 021, 022, 023, 024, 025, 026, 027, 028, 029, 030, 031, 032, 033, 034, 035, 036, 037, 038, 039, 040, 041, 042, 043, 044, 045, 046, 047, 048, 049, 050, 051, 052, 053, 054, 055, 056, 057, 058, 059, 060, 061, 062, 063, 064, 065, 066, 067, 068, 069, 070, 071, 072, 073, 074, 075, 076, 077, 078, 079, 080, 081, 082, 083, 084, 085, 086, 087, 088, 089, 090, 091, 092, 093, 094, 095, 096, 097, 098, 099.
    Par contre, si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regex_0_255 = re.compile('^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$')
    Alors le programme m'affiche bien OK.

    Quelques explications sur mon code :
    • exhaustive_expected_matches contient les 256 chaînes de '0' à '255'.
    • some_expected_mismatches contient toutes les chaînes de '256' à '999' et les 1000 chaînes de '00' à '0999' (toujours avec un seul 0 en trop à gauche).
    • bad_mismatches contient les chaînes de exhaustive_expected_matches refusées par regex_0_255, alors qu'elles auraient dû être acceptées.
    • bad_matches contient les chaînes de some_expected_mismatches acceptées par regex_0_255, alors qu'elles auraient dû être refusées.
    • Si bad_mismatches est non vide, alors j'affiche son contenu dans un message. Si bad_matches est non vide, alors j'affiche son contenu dans un message. Si les deux sont vides, alors j'affiche OK.


    Dans mon expression régulière, j'ai décomposé le problème en sous-problèmes de cette manière : j'ai traité le cas des chaînes à un caractère, puis le cas de celles à deux caractères, puis le cas de celles à trois caractères.

Discussions similaires

  1. Expressions régulières (regexp, regexprep)
    Par nofasc95 dans le forum MATLAB
    Réponses: 4
    Dernier message: 02/04/2009, 11h51
  2. Expression régulière (REGEXP) en SQL
    Par yanice dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/01/2009, 17h29
  3. expression régulière regexp
    Par Naktan dans le forum C
    Réponses: 2
    Dernier message: 16/08/2007, 19h16
  4. [regexp] pbl expression réguliére et menu déroulant
    Par UNi[FR] dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/06/2005, 09h37
  5. [RegExp]expression régulière
    Par illegalsene dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2005, 15h33

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