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 :

Supprimer caractère à la Nième position dans une chaine


Sujet :

Langage Perl

  1. #21
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,
    On peut aussi utiliser \G ( qui est couplé avec pos ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $str="0100110101100Z";
    pos($str)=9;
    $str =~ s/.\G//;
    print $str."\n";
    ce qui donne aussi:
    Merci pour ta solution, ça marche impeccablement!
    Mon problème est résolu (je vais donc marquer le sujet comme résolu), mais si quelqu'un a des explications sur comment ça marche, je suis preneur!

  2. #22
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    C'est que tes regex ne reconnaissent pas ta chaîne de caractères ou du moins ne capturent pas correctement tes fragments de texte. Les variables $1, $2, etc. fonctionnent très bien avec toutes les versions de Perl 5 sans exception, et sur toutes les plateformes. Donc, si tu n'y arrives pas, c'est que tu fais quelque chose d'incorrect. Poste un exemple où ça ne marche pas et on pourra t'aider.

    Sinon, avec la technique "de bricoleur retors et pas doué" que tu employais dans ton post d'origine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $string = "012345678901234567890";
    my ($bout1, $bout2) = $string =~ /(\d{8}).(\d+)/;
    print $bout1.$bout2; #   -> 01234567901234567890 - on a bien enlevé le 8, le neuvième caractère
    Ou, en utilisant la même chaîne $string et les variables $1 et $2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "$1$2\n" if $string =~ /(\d{8}).(\d+)/;   -> 01234567901234567890 - idem
    Ou en utilisant un opérateur s/// de substitution et $1 et $2 (même principe que ce qu'a proposé Djibril):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $string = "012345678901234567890";
    $string =~ s/(\d{8}).(\d+)/$1$2/;
    print "$string\n";  -> 01234567901234567890 - idem
    Sinon, avec la fonction substr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $string = "012345678901234567890";
    print substr ($string, 0, 8), substr ($string, 9), "\n";   # -> 01234567901234567890 - idem
    Effectivement mes regexp devaient être fautives, parce que $1 et compagnie fonctionnent avec la regexp de disedorgue.
    Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $ref_article = $1 if (/REF_ARTICLE}[\s]*=[\s]*"([\w]{10})"/); # apparemment, ne renvoie rien dans ref_article
    ne fonctionne pas et me laisse $ref_article à la valeur undef.
    $ref_article est censé être une suite de 10 caractères, obligatoirement renseignée.
    La raison pour laquelle il n'y a pas de est parce que je suis dans une boucle du type (je sais, c'est une syntaxe louche, patapé ).

  3. #23
    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
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNoobEnPerl Voir le message
    Effectivement mes regexp devaient être fautives, parce que $1 et compagnie fonctionnent avec la regexp de disedorgue.
    Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $ref_article = $1 if (/REF_ARTICLE}[\s]*=[\s]*"([\w]{10})"/); # apparemment, ne renvoie rien dans ref_article
    ne fonctionne pas et me laisse $ref_article à la valeur undef.
    $ref_article est censé être une suite de 10 caractères, obligatoirement renseignée.

    Hum, ta regex me paraît bien compliquée pour ce que tu décris.

    Peux-tu donner quelques exemples des lignes en entrée sur lesquelles tu utilises cette regex?

  4. #24
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Hum, ta regex me paraît bien compliquée pour ce que tu décris.

    Peux-tu donner quelques exemples des lignes en entrée sur lesquelles tu utilises cette regex?
    Normalement, je ne suis pas censé le faire...
    Voilà en gros ce qui se situe quelque part dans la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ... REF_ARTICLE="0123456789" ...
    Je souhaite extraire 0123456789 dans la variable $ref_article.

  5. #25
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Ici, tu veux récupérer ce qui est en rouge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... REF_ARTICLE="0123456789" ...
    Donc dans un premier temps, faisons la capture sur cette chaine précise (ici, je le fais en uniligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo '... REF_ARTICLE="0123456789" ...' | perl -ne '/... REF_ARTICLE="(0123456789)" .../; print $1."\n"'
    0123456789
    On est ok, ça fonctionne, maintenant, essayons de la rendre générique, donc retirons déjà ce qui est inutile dans la recherche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo '... REF_ARTICLE="0123456789" ...' | perl -ne '/REF_ARTICLE="(0123456789)"/; print $1."\n"'
    0123456789
    Là, ça fonctionne aussi, mais sur une chaine précise que l'on a réduit au minimum, reste plus qu'à identifier comment rendre générique la capture et ici on voit que ça commence par un guillemet et que ça fini par un guillemet (ceux-ci exclu de la capture) et de plus, on sait que l'on ne peut pas avoir de chaine vide ce que l'on peut traduire en expression régulière par (en rouge, la regex) : "([^"]+)".
    et donc, au final ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo '... REF_ARTICLE="0123456789" ...' | perl -ne '/REF_ARTICLE="([^"]+)"/; print $1."\n"'
    0123456789
    Cordialement.

  6. #26
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Problème résolu...
    Il y avait juste un { que j'avais rajouté par erreur, une faute de frappe toute bête...

  7. #27
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ici, tu veux récupérer ce qui est en rouge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... REF_ARTICLE="0123456789" ...
    Donc dans un premier temps, faisons la capture sur cette chaine précise (ici, je le fais en uniligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo '... REF_ARTICLE="0123456789" ...' | perl -ne '/... REF_ARTICLE="(0123456789)" .../; print $1."\n"'
    0123456789
    On est ok, ça fonctionne, maintenant, essayons de la rendre générique, donc retirons déjà ce qui est inutile dans la recherche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo '... REF_ARTICLE="0123456789" ...' | perl -ne '/REF_ARTICLE="(0123456789)"/; print $1."\n"'
    0123456789
    Là, ça fonctionne aussi, mais sur une chaine précise que l'on a réduit au minimum, reste plus qu'à identifier comment rendre générique la capture et ici on voit que ça commence par un guillemet et que ça fini par un guillemet (ceux-ci exclu de la capture) et de plus, on sait que l'on ne peut pas avoir de chaine vide ce que l'on peut traduire en expression régulière par (en rouge, la regex) : "([^"]+)".
    et donc, au final ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo '... REF_ARTICLE="0123456789" ...' | perl -ne '/REF_ARTICLE="([^"]+)"/; print $1."\n"'
    0123456789
    Aaaaah merci! Je comprends mieux le [^"] qu'utilisait un de mes collègues dans el code qu'il m'avait passé comme exemple!

  8. #28
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    disedorgue, lolo78

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [C#] String Regex Position dans une chaine de caratère correspondant à un regex.
    Par jpbelmondo59 dans le forum Développement Windows
    Réponses: 1
    Dernier message: 09/06/2011, 13h41
  2. Réponses: 3
    Dernier message: 19/12/2009, 21h30
  3. expression regulières supprimer les doublons de caratéres dans une chaine
    Par karimphp dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/12/2007, 14h26
  4. Supprimer les retours à la ligne dans une chaine
    Par koktel_dfr dans le forum C
    Réponses: 22
    Dernier message: 03/05/2007, 10h12
  5. Réponses: 5
    Dernier message: 21/01/2007, 00h43

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