1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    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
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : août 2005
    Messages : 623
    Points : 1 010
    Points
    1 010

    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 : 22
    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
    Administrateur Unix / Oracle retraité
    Inscrit en
    septembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur Unix / Oracle retraité
    Secteur : Service public

    Informations forums :
    Inscription : septembre 2011
    Messages : 1 326
    Points : 2 007
    Points
    2 007

    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
    Débutant HTML, CSS, JavaScript... Arduino... ...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    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
    Administrateur Unix / Oracle retraité
    Inscrit en
    septembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur Unix / Oracle retraité
    Secteur : Service public

    Informations forums :
    Inscription : septembre 2011
    Messages : 1 326
    Points : 2 007
    Points
    2 007

    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;
    Débutant HTML, CSS, JavaScript... Arduino... ...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    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
    Administrateur Unix / Oracle retraité
    Inscrit en
    septembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur Unix / Oracle retraité
    Secteur : Service public

    Informations forums :
    Inscription : septembre 2011
    Messages : 1 326
    Points : 2 007
    Points
    2 007

    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...
    Débutant HTML, CSS, JavaScript... Arduino... ...

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    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
    Administrateur Unix / Oracle retraité
    Inscrit en
    septembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur Unix / Oracle retraité
    Secteur : Service public

    Informations forums :
    Inscription : septembre 2011
    Messages : 1 326
    Points : 2 007
    Points
    2 007

    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...
    @+
    Débutant HTML, CSS, JavaScript... Arduino... ...

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    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
    Administrateur Unix / Oracle retraité
    Inscrit en
    septembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur Unix / Oracle retraité
    Secteur : Service public

    Informations forums :
    Inscription : septembre 2011
    Messages : 1 326
    Points : 2 007
    Points
    2 007

    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...
    Débutant HTML, CSS, JavaScript... Arduino... ...

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    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
    Administrateur Unix / Oracle retraité
    Inscrit en
    septembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur Unix / Oracle retraité
    Secteur : Service public

    Informations forums :
    Inscription : septembre 2011
    Messages : 1 326
    Points : 2 007
    Points
    2 007

    Par défaut

    Et moi non plus !
    On n'est pas sorti de l'auberge
    Débutant HTML, CSS, JavaScript... Arduino... ...

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    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 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 19 084
    Points : 496 013
    Points
    496 013

    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 : 22
    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 Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    2 426
    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 : 2 426
    Points : 6 746
    Points
    6 746

    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 124
    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 124
    Points : 10 118
    Points
    10 118
    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 124
    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 124
    Points : 10 118
    Points
    10 118
    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, 14h41
  2. Réponses: 3
    Dernier message: 19/12/2009, 22h30
  3. Réponses: 5
    Dernier message: 16/12/2007, 15h26
  4. Supprimer les retours à la ligne dans une chaine
    Par koktel_dfr dans le forum C
    Réponses: 22
    Dernier message: 03/05/2007, 11h12
  5. Réponses: 5
    Dernier message: 21/01/2007, 01h43

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