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. #1
    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 Supprimer caractère à la Nième position dans une chaine
    Bonjour à tous!
    Je cherche à supprimer un caractère situé à une certaine position dans une chaine (dans mon cas, le 9ème caractère de la chaine, un 0 et la chaine est une suite de chiffres avec 0 ou 1 lettre majuscule à la fin), mais n'y arrive pas. :/
    J'ai tenté avec des expressions régulières de capturer les 8 premiers caractères puis tous ceux après le 9ème (en les mettant dans des bouts puis en les recollant après, tel un bricoleur retors et pas doué), mais apparemment, ça ne marche pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $bout1;
    my $bout2;
    ($bout1, $bout2) = $csn =~ m/([\d]{8})0([\d]{5}[A-Z]?)/; # on garde les 8 premiers caractères et les 5 ou 6 derniers
    $csn = $bout1.$bout2;
    Ou me suis-je fourvoyé? Quelle approche me conseilleriez-vous?

  2. #2
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    Si la position est toujours la même, pourquoi ne pas utiliser substr ?
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #3
    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 Gardyen Voir le message
    Si la position est toujours la même, pourquoi ne pas utiliser substr ?
    Il me semblait avoir compris que substr "mange" la chaine à partir de la gauche, non?

  4. #4
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    Sinon, si c'est pour jouer avec les expressions régulières, tu peux faire 3 motifs qui seront récupérés dans $1 $2 et $3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my $Lib = '1234567890987654321';
     
    $Lib =~ m/([\d]{7})(.)([\d]*)/;
    print "=$Lib=\n";
     
    print "UN=$1=\n";
    print "DEUX=$2=\n";
    print "TROIS=$3\n";
     
    print "$1"."$3";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    E:\_DEV\Developpez\LeNoobEnPerl>perl Noob_1.pl
    =1234567890987654321=
    UN=1234567=
    DEUX=8=
    TROIS=90987654321
    123456790987654321

  5. #5
    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 dmganges Voir le message
    Bonjour,
    Sinon, si c'est pour jouer avec les expressions régulières, tu peux faire 3 motifs qui seront récupérés dans $1 $2 et $3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my $Lib = '1234567890987654321';
     
    $Lib =~ m/([\d]{7})(.)([\d]*)/;
    print "=$Lib=\n";
     
    print "UN=$1=\n";
    print "DEUX=$2=\n";
    print "TROIS=$3\n";
     
    print "$1"."$3";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    E:\_DEV\Developpez\LeNoobEnPerl>perl Noob_1.pl
    =1234567890987654321=
    UN=1234567=
    DEUX=8=
    TROIS=90987654321
    123456790987654321
    Le problème, c'est que ça n'est pas quelque chose que je fais pour jouer avec Perl mais bien pour un stage ^^'
    Et le problème à mon travail est que les $1, $2 etc ne fonctionnent jamais et on toujours pour valeur undef peu importe la regexp que j'utilise... :/

  6. #6
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Citation Envoyé par LeNoobEnPerl
    Le problème, c'est que ça n'est pas quelque chose que je fais pour jouer avec Perl mais bien pour un stage ^^'
    Jouer, c'était pour rire

    Et le problème à mon travail est que les $1, $2 etc ne fonctionnent jamais et on toujours pour valeur undef peu importe la regexp que j'utilise... :/
    Tu peux nous en dire plus :
    Unix/Linux/Windows... Version de perl :
    Sinon je reste sec... et même avec les infos demandées

    [Edit 18:10]
    et tu n'oublies pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use warnings;
    use strict;

  7. #7
    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 dmganges Voir le message
    Jouer, c'était pour rire


    Tu peux nous en dire plus :
    Unix/Linux/Windows... Version de perl :
    Sinon je reste sec... et même avec les infos demandées
    Windows 7, perl 5.16 il me semble (je ne suis pas à mon bureau là, je ne peux pas vérifier :/).

  8. #8
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    5.16 c'est un peu vieux, mais ça devrait fonctionner...
    vois le [Edit] ci-dessus pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use warnings;
    use strict;
    ça donnera peut-être une info...

  9. #9
    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
    Justement, la version n'étant pas une relique antique, je ne comprends pas non plus :/
    Bien sûr, j'utilise toujours warnings et strict, lesquels ne me donnent pas d'autre info que "attention tu utilise une variable non initialisée"

  10. #10
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    OK, donc je reste sec !
    Attends un peu d'autres plus doués que moi devrait avoir des idées...
    Si j'ai une lumière je reviens...
    @+

  11. #11
    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
    Pas de problèmes, merci de ton aide!

    Si quelqu'un a des explications claires sur struct, je suis preneur, je ne comrpends pas trop celles de perldoc en général, que je trouve trop fouilli et désorganisé.

  12. #12
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Quand tu pourras teste le bout de code que j'ai collé...
    Je pense que si tes $1 ... sont undef c'est que ta regex n'est pas correctement construite...

  13. #13
    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 dmganges Voir le message
    Quand tu pourras teste le bout de code que j'ai collé...
    Je pense que si tes $1 ... sont undef c'est que ta regex n'est pas correctement construite...
    Je testerai ça demain matin et te tiendrai au courant.
    C'est possible, je ne suis pas très bon en regexp ^^'

  14. #14
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Et moi non plus !
    On n'est pas sorti de l'auberge

  15. #15
    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 dmganges Voir le message
    Et moi non plus !
    On n'est pas sorti de l'auberge
    Je pense qu'il ne nous reste qu'a faire appel à Jedai, il me semble avoir vu dans d'autres postes qu'il touche sa bille en regexp XD

  16. #16
    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
    Bonsoir,

    C'est ce que tu souhaites ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $chaine = '0100110101100Z';
    my $rsultat = $chaine;
    $resultat =~ s/^(\d{8}).(\d{4}[A-Z]?)$/$1$2/;
    print $resultat;
    010011011100Z
    C'est bien cela ?

  17. #17
    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 djibril Voir le message
    Bonsoir,

    C'est ce que tu souhaites ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $chaine = '0100110101100Z';
    my $rsultat = $chaine;
    $resultat =~ s/^(\d{8}).(\d{4}[A-Z]?)$/$1$2/;
    print $resultat;

    C'est bien cela ?
    C'est bien ça, merci beaucoup!!! Je testerai ça demain matin, je vous tiens au courant.

  18. #18
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 717
    Points
    12 717
    Par défaut
    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:
    010011011100Z
    Cordialement.

  19. #19
    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
    Et le problème à mon travail est que les $1, $2 etc ne fonctionnent jamais et on toujours pour valeur undef peu importe la regexp que j'utilise... :/
    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

  20. #20
    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 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";
    Très bonne idée ++. Je n'y aurais pas pensé.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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