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 :

Extraction avec expression régulière


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut Extraction avec expression régulière
    bonjour ;

    je suis entrain de faire une fonction mais je bloc sur une manière de faire.
    voila :
    j'ai une information du type a[200:50]
    je dois extraire l'information 200 et 50.
    donc j'ai fais une regexp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if($bus =~ m/^a\[\d+:\d+\]$/i){
    $k=   #je veux le 200
    $l=   #je veux le 50
    merci pour toutes aides

  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
    Avec ça, ça devrait marcher...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (my ($k, $l) = $bus =~ m/^a\[(\d+):(\d+)\]$/i) {
    $k; # $k contient 200
    $l;  # $l contient 50
    D'une manière plus générique, tu peux extraire le contenu des accolades (avec une regexp du style $bus =~ /\[(.+?)\]/) puis découper le contenu avec split et ":" comme séparateur.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Avec ça, ça devrait marcher...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (my ($k, $l) = $bus =~ m/^a\[(\d+):(\d+)\]$/i) {
    $k; # $k contient 200
    $l;  # $l contient 50
    D'une manière plus générique, tu peux extraire le contenu des accolades (avec une regexp du style $bus =~ /\[(.+?)\]/) puis découper le contenu avec split et ":" comme séparateur.
    merci
    Voila la fonction un peu modifier ......
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    my $bb = "a[200:50]";
    my  ($q,$qq) = bus($bb);
    print"$q,$qq\n";
    sub bus {
            my ($b) = @_;
            my ($prem,$sec)="";
            if($b =~ m/^a\[(\d+):(\d+)\]$/){
                    # my @t = split /":"/,$1;
                    ($prem,$sec) =($1,$2);
            }
            return ($prem,$sec);
     }

  4. #4
    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
    Citation Envoyé par misterfed Voir le message
    merci
    Voila la fonction un peu modifier ......
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    my $bb = "a[200:50]";
    my  ($q,$qq) = bus($bb);
    print"$q,$qq\n";
    sub bus {
            my ($b) = @_;
            my ($prem,$sec)="";
            if($b =~ m/^a\[(\d+):(\d+)\]$/){
                    # my @t = split /":"/,$1;
                    ($prem,$sec) =($1,$2);
            }
            return ($prem,$sec);
     }
    Juste un petit point, si l'expression régulière échoue, ton affectation ($prem,$sec) =($1,$2) va mettre des valeurs indéfinies dans tes variables et tu vas retourner une liste de deux scalaires indéfinis à la fonction appelante. Ce n'est pas forcément un problème si tu gères ce cas de figure, mais il faut en tenir compte.

    Cela dit, ce serait tout de même plus simple d'écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub bus {
            $_ = shift; # met le contenu du premier paramètre dans $_
            return ($1, $2) if /^a\[(\d+):(\d+)\]$/; # compare l'expression régulière à $_
    }

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Juste un petit point, si l'expression régulière échoue, ton affectation ($prem,$sec) =($1,$2) va mettre des valeurs indéfinies dans tes variables et tu vas retourner une liste de deux scalaires indéfinis à la fonction appelante. Ce n'est pas forcément un problème si tu gères ce cas de figure, mais il faut en tenir compte.

    Cela dit, ce serait tout de même plus simple d'écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub bus {
            $_ = shift; # met le contenu du premier paramètre dans $_
            return ($1, $2) if /^a\[(\d+):(\d+)\]$/; # compare l'expression régulière à $_
    }
    je viens juste de tester ta fonction elle ne recupere pas les deux valeurs numeriques mais elle me parait juste. teste pour voir

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par misterfed Voir le message
    je viens juste de tester ta fonction elle ne recupere pas les deux valeurs numeriques mais elle me parait juste. teste pour voir

    Autant pour moi ELLE FONCTIONNE TRES BIEN TA FONCTION, je suis fatigue ce matin car j'ai donne un mauvais jeux de test

  7. #7
    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
    Citation Envoyé par Lolo78 Voir le message
    Juste un petit point, si l'expression régulière échoue, ton affectation ($prem,$sec) =($1,$2) va mettre des valeurs indéfinies dans tes variables et tu vas retourner une liste de deux scalaires indéfinis à la fonction appelante. Ce n'est pas forcément un problème si tu gères ce cas de figure, mais il faut en tenir compte.
    Non Lolo, si l'expression régulière échoue, on ne rentre pas dans le if, et on n'affecte pas $prem et $sec avec $1 et $2.
    Donc par défaut, on retournera les valeurs qui leur ont été affectée avant. Et c'est là qu'est l'erreur de misterfed:

    Ici, tu affectes un scalaire (une chaine vide) à une liste. Perl, dans sa grande bonté, accepte et affecte la chaine vide à $prem, mais il n'affecte rien à $sec (qui est alors undef).
    Une manière plus légale d'affecter une liste de valeurs à une liste de variables est de mettre une liste à droite de l'opérateur d'affectation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my ($prem,$sec)=(""); # affecte "" à $prem et rien à $sec
    my ($prem,$sec)=(undef, ""); # affecte undef à $prem et "" à $sec
    my ($prem,$sec)=("", ""); # affecte "" à $prem et à $sec
    my ($prem,$sec)=("") x 2; # affecte "" à $prem et à $sec
    Bonne journée

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Non Lolo, si l'expression régulière échoue, on ne rentre pas dans le if, et on n'affecte pas $prem et $sec avec $1 et $2.
    Donc par défaut, on retournera les valeurs qui leur ont été affectée avant. Et c'est là qu'est l'erreur de misterfed:

    Ici, tu affectes un scalaire (une chaine vide) à une liste. Perl, dans sa grande bonté, accepte et affecte la chaine vide à $prem, mais il n'affecte rien à $sec (qui est alors undef).
    Une manière plus légale d'affecter une liste de valeurs à une liste de variables est de mettre une liste à droite de l'opérateur d'affectation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my ($prem,$sec)=(""); # affecte "" à $prem et rien à $sec
    my ($prem,$sec)=(undef, ""); # affecte undef à $prem et "" à $sec
    my ($prem,$sec)=("", ""); # affecte "" à $prem et à $sec
    my ($prem,$sec)=("") x 2; # affecte "" à $prem et à $sec
    Bonne journée
    merci pour la leçon

  9. #9
    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
    Citation Envoyé par Philou67430 Voir le message
    Non Lolo, si l'expression régulière échoue, on ne rentre pas dans le if, et on n'affecte pas $prem et $sec avec $1 et $2.
    Donc par défaut, on retournera les valeurs qui leur ont été affectée avant.
    Exact Philou, j'ai lu le code trop vite.


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

Discussions similaires

  1. [WD16] Extraction de souschaine avec Expressions régulières
    Par mogwai162 dans le forum WinDev
    Réponses: 20
    Dernier message: 24/05/2012, 11h00
  2. pb avec expression régulière (regex)
    Par rudhf dans le forum C#
    Réponses: 12
    Dernier message: 10/05/2007, 15h20
  3. [RegEx] Contrôle avec expression régulière
    Par lodan dans le forum Langage
    Réponses: 8
    Dernier message: 23/10/2006, 19h32
  4. [RegEx] Problème avec expressions régulières.
    Par Cygnus Saint dans le forum Langage
    Réponses: 12
    Dernier message: 14/08/2006, 11h55
  5. [C#] Caractères hexadécimal avec expressions régulières
    Par shinchan dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/01/2006, 11h41

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