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 Perl Discussion :

Regex avec un switch


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 29
    Par défaut Regex avec un switch
    Bonjour,
    Je suis une vrai novice en Regex et j'ai vraiment du mal à comprendre la syntaxe.

    Mon problème est simple :
    j'ai une variable contenant une désignation. Je veux que grâce à des Regex faire:

    Si ma désignation contient au moins deux ou plus des mots de ma Regex alors j'initialise ma variable avec un nombre.

    J'ai essayé plusieurs Regex mais perl refusait que j'utilise le \g ce qui pourtant d'après le site http://www.regexr.com/ ma Regex fonctionnait.

    Pourriez-vous m'éclairer sur la façon de construire cette Expression. Merci d'avance.

    Première version de mon expréssion : Mais la j'avais une erreur : " Reference to invalid group 0 in regex perl ...."
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     /(Revue)|(de)|(besoins)|(d'achats)/g
    J'ai ensuite pensé à lui faire la liste des mots :

    Deuxième version :
    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
     
    my $typeJalon;
    switch (@Ligne[3]) {
    	case /Revue|besoins|d'achats/ { $typeJalon = 12; last;}
    	case /Evaluation|fournisseurs/ {$typeJalon = 20; last;}
    	case /Bilan|interne|formation/ {$typeJalon = 3; last;}
    	case /Reunion|lancement|formation /{$typeJalon = 14; last;}
    	case /Developpement|des|supports|formations/ {$typeJalon = 5; last;}
    	case /Conformité|supports-spécifications/ {$typeJalon = 6; last;}
    	case /PV|formation/{$typeJalon = 7; last;}
    	case /Redaction|spécifications|formation/ {$typeJalon = 8; last;}
    	case /Revue|demarrage/ {$typeJalon = 9; last;}
    	case /Plan|qualite/ {$typeJalon = 10; last;}
    	case /Revue|transfert|maintenance-chantier/ {$typeJalon = 11; last;}
    	case /Revue|Projet-SI/ {$typeJalon = 13; last;}
    	case /Reunion|lancement|formation/ {$typeJalon = 14; last;}
    	case /Definition|des|besoins|projet/ {$typeJalon = 15; last;}
    	case /Revue|lancement|Fin|projet/ {$typeJalon = 16; last;}
    	case /Revue|Fin|projet/ {$typeJalon = 17; last;}
    	case /Revue|transfert|chantier-maintenance/ {$typeJalon = 18; last;}
    	case /Revue|passage|garantie-maintenance/ {$typeJalon = 19; last;}
    	case /Revue|specification/ {$typeJalon = 21; last;}
    	case /Revue|conception/ {$typeJalon = 22; last;}
    	case /Revue|choix|technique/ {$typeJalon = 23; last;}
    	case /Revue|livraison|materiel/ {$typeJalon = 24; last;}
    	case /Revue|livraison|logiciel/ {$typeJalon = 25; last;}
    	case /Revue|recette|interne/ {$typeJalon = 26; last;}
    	case /Note|d’organisation|recette/ {$typeJalon = 27; last;}
    	case /Evaluation|deroulement|projet/ {$typeJalon = 20; last;}
    	case /PV|reception|provisoire/ {$typeJalon = 29; last;}
    	case /PV|recette|usine/ {$typeJalon = 30; last;}
    	case /PV|recette|site/ {$typeJalon = 31; last;}
    	case /PV|reception|definitive/ {$typeJalon = 32; last;}
    	case /Rapport|d'activite/ {$typeJalon = 37; last;}
    	case /Bilan|annuel/ {$typeJalon = 38; last;}
    	case /Visite|preventive|site/ {$typeJalon = 39; last;}
    	case /Reunion|annuelle/ {$typeJalon= 40; last;}
    	else { $typeJalon = 0; }
    }
    Mais il ne repère pas correctement les choses ça n'a aucun sens puisqu'il affecte des numéros alors que la désignation traitée ne contient même pas les termes.

    Un big mega gros merci à celui qui m'aidera !!!!!!

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Pour être bien sûr de comprendre, prenons un exemple : tu voudrais que si la désignation contient soit le mot "Revue", soit le mot "besoins", soit le mot "d'achats", alors $typeJalon soit mis à 12 ? (je dis bien "l'un de ces mots là" : c'est à dire que si la désignation est "Revue démarrage", alors $typeJalon vaudra 12 et non 9 comme tu le suggères dans ton bout de code).

  3. #3
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 29
    Par défaut
    Hum... tu viens de voir un truc que je pensais pas.

    Je vais peut-être limité mes recherches pour que la désignation contienne obligatoirement que deux mots et il faut que se soit insensible aux majuscules/minuscules...


    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
     
    my $typeJalon;
    switch (@Ligne[3]) {
    	case /Revue|d'achats/ { $typeJalon = 12; last;}
    	case /Evaluation|fournisseurs/ {$typeJalon = 20; last;}
    	case /Bilan|interne|formation/ {$typeJalon = 3; last;}
    	case /lancement|formation /{$typeJalon = 14; last;}
    	case /supports|formations/ {$typeJalon = 5; last;}
    	case /Conformité|supports-spécifications/ {$typeJalon = 6; last;}
    	case /PV|formation/{$typeJalon = 7; last;}
    	case /spécifications|formation/ {$typeJalon = 8; last;}
    	case /Revue|demarrage/ {$typeJalon = 9; last;}
    	case /Plan|qualite/ {$typeJalon = 10; last;}
    	case /transfert|maintenance-chantier/ {$typeJalon = 11; last;}
    	case /Revue|Projet-SI/ {$typeJalon = 13; last;}
    	case /lancement|formation/ {$typeJalon = 14; last;}
    	case /besoins|projet/ {$typeJalon = 15; last;}
    	case /Fin|projet/ {$typeJalon = 16; last;}
    	case /Revue|Fin|projet/ {$typeJalon = 17; last;}
    	case /transfert|chantier-maintenance/ {$typeJalon = 18; last;}
    	case /passage|garantie-maintenance/ {$typeJalon = 19; last;}
    	case /Revue|specification/ {$typeJalon = 21; last;}
    	case /Revue|conception/ {$typeJalon = 22; last;}
    	case /choix|technique/ {$typeJalon = 23; last;}
    	case /livraison|materiel/ {$typeJalon = 24; last;}
    	case /livraison|logiciel/ {$typeJalon = 25; last;}
    	case /recette|interne/ {$typeJalon = 26; last;}
    	case /Note|recette/ {$typeJalon = 27; last;}
    	case /Evaluation|projet/ {$typeJalon = 20; last;}
    	case /reception|provisoire/ {$typeJalon = 29; last;}
    	case /recette|usine/ {$typeJalon = 30; last;}
    	case /recette|site/ {$typeJalon = 31; last;}
    	case /reception|definitive/ {$typeJalon = 32; last;}
    	case /Rapport|d'activite/ {$typeJalon = 37; last;}
    	case /Bilan|annuel/ {$typeJalon = 38; last;}
    	case /Visite|preventive/ {$typeJalon = 39; last;}
    	case /Reunion|annuelle/ {$typeJalon= 40; last;}
    	else { $typeJalon = 0; }
    }
    merci de te pencher sur mon cas ;-)

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Pour l'insensibilité à la casse, ajoute l'option i à la regexp : /Revue|d'achats/i
    Cela dit, ton nouveau code ne règle pas le problème lié à la présence du mot "Revue" dans 2 cas de figures où $typeJalon doit avoir deux valeurs différentes.
    Ta discrimination n'est pas complète, et par ailleurs, ne me semble pas "judicieuse".

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Deux remarques sur des erreurs probables:
    Si tu veux le quatrième élément du tableau @Ligne, il faut écrire:

    Si tu avais mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use strict;
    use warnings;
    au début de ton code (comme tu devrais toujours le faire), le compilateur t'aurait prévenu de cette erreur.


    Ensuite, la logique de ton switch est erronée. Si ta donnée comprends le mot "Revue", c'est le premier case qui s'exécutera, même si la ligne contient "'Revue demarrage". Si bien que toutes les autres expressions régulières contenant le mot "Revue" ne servent à rien dans ton code. Ce n'est sans doute pas ce que tu souhaites (même si je ne suis pas sûr de comprendre ce que tu veux vraiment).

    J'ajoute que le switch est "déprécié" et ne devrait sans doute plus être utilisé.

  6. #6
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 29
    Par défaut
    Je n'ai pas donnée la page entière de mon code et j'utilise bien les packages et j'utilise mes tableaux toujours en mettant l'arrobase et je n'ai jamais eu d'erreur. Mais si ce n'est pas de coutume je vais changer merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    use strict;
    use Win32::ODBC;
    use Net::SMTP;
    use DBI;
    use Win32::OLE qw(in with);
    use Win32::OLE::Const 'Microsoft Excel';
    use Switch;
    Après en ce qui concerne mes Regex je vous demande de l'aide car je ne sais pas en faire
    Ce que je vous demande c'est de m'expliquer juste qu'elle évolution je peux apporter pour que je trouve le couple 'Revue' et 'démarrage' (par exemple) pour affecter la valeur que j'ai défini.

    J'ai une base de données avec un très grand nombre d'enregistrement à basculer dans une nouvelle avec des contraintes plus accru pour éviter les désignations libres.

    Je souhaite donc faire en sorte de trouver dans les anciennes désignations le type de la nouvelle.


    Pour le switch, s'il n’est plus conseillé de l’utiliser aujourd'hui par quoi pensez-vous que je puisse basculer ? Une condition If me semble trop lourde.

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

Discussions similaires

  1. Problème avec un switch contenant des strings
    Par dessinateurttuyen dans le forum Langage
    Réponses: 6
    Dernier message: 18/07/2006, 12h56
  2. [Tableaux] Probleme avec les switch
    Par grumly22 dans le forum Langage
    Réponses: 9
    Dernier message: 10/04/2006, 10h51
  3. Probleme avec mon switch
    Par Fredovsky dans le forum C
    Réponses: 6
    Dernier message: 23/03/2006, 16h47
  4. [Système] Probleme avec un switch case!
    Par Death83 dans le forum Langage
    Réponses: 7
    Dernier message: 29/01/2006, 16h28
  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