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 en hexa


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    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 452
    Par défaut regex en hexa
    Bonjour,
    Je ne trouve pas comment représenter un caractère quelconque dans une regex exprimée en hexa sur 2 octets.

    Je désire supprimer 1 caractère C précédé de 4 caractères ABxx dont seul les 2 premiers sont connus, et en conservant le reste, bien sûr.

    ABxxC... --> ABxx...

    Intuitivement ça pourrait avoir cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # Suppression chadda solaire
    # Supprime chadda \x{0651} sur lettre précédée de (\x{0627}\x{0644})
    # et suivie par 2 caractères quelconques
     
        $Lig =~ s/\x{0627}\x{0644}(.)(.)\x{0651}/\x{0627}\x{0644}(.)(.)/go;
    Sauf que mon intuition est fausse bien sûr, la notation (.) est fausse !

    Merci d'avance pour votre aide !

  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
    Plusieurs solutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $text = "ABabC";
    $text =~ s/AB..\KC//;
    $text =~ s/(?<=AB..)C//;
    $text =~ s/(AB..)C/$1/;
    Pour les explications: perldoc perlre (sinon, demander ici même)

  3. #3
    Membre Expert Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    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 452
    Par défaut
    MERCI de ta réponse Philou67430,
    Sur des chaînes ASCII sur 1 octet c'est parfait,
    mais sur des chaînes arabes (Utf8 2 octets) ça ne fonctionne pas !

    Il faut absolument les coder en hexa !!!
    Ou bien j'ai loupé qqc !

    A titre info, les seules substitutions que j'arrive à réaliser sont des substitutions ultra simples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Suppresion des voyelles courtes suivies de voyelles longues
    	if ( $config{DEFAUT}{dia_2} == 1 ) {
     
        $Lig =~ s/\x{064E}\x{0627}/\x{0627}/go; # Supprime Fatha devant Alif ا
        $Lig =~ s/\x{064E}\x{0649}/\x{0649}/go; # Supprime Fatha devant Alif marsour ى
        $Lig =~ s/\x{0650}\x{064A}/\x{064A}/go; # Supprime Kasra devant Ya ي
        $Lig =~ s/\x{064F}\x{0648}/\x{0648}/go; # Supprime Damma devant Oua و
     
    		return $Lig;    
    }
    J'ai épluché le O'Reilly de Jeffrey E.F. Frield + pas mal de site sans résultat !

    En tous cas MERCI , ça fait du bien de ne pas se sentir isolé

  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
    A voir si tes données d'entrée sont bien codées (et/ou lues par perl) en UTF8.

    Peux-tu donner un exemple de fichier d'entrée (sous forme d'une pièce attachée) et un bout de script pour tester ?

  5. #5
    Membre Expert Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    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 452
    Par défaut
    Résolu :

    $Lig =~ s/\x{0627}\x{0644}(.)(.)\x{0651}/\x{0627}\x{0644}$1$2/g;


    MERCI Philou67430

    Le bout de code c'est :
    $Lig =~ s/\x{0627}\x{0644}(.)(.)\x{0651}/\x{0627}\x{0644}$1$2/g;

    çà aussi ça marche :

    $Lig =~ s/(\x{0627}\x{0644}..)\x{0651}/$1/g;

    la chaine dans $Lig :
    الصَّيْف

    une fois transformée le ّ disparaît !

    Encore MERCI !

  6. #6
    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
    Dans ce cas, les exemples que j'avais donnés fonctionnent aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Lig =~ s/\x{0627}\x{0644}..\K//g;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Lig =~ s/(?<=\x{0627}\x{0644}..)\x{0651}//g;
    Tu as en fait choisi ma 3e alternative

    Pour ce qui est des caractères arabes, effectivement, s'ils ne sont pas génériques (. \w, ...), il faut les spécifier avec leur code (\x{....}) ou unicode (\N{U+....}).

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

Discussions similaires

  1. conversion : (Ascii en hexa) => nombre
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 21/04/2004, 14h44
  2. [langage] conversion décimal vers hexa
    Par chipster dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2004, 16h05
  3. [regex][string] replaceAll bogué ?
    Par 7eme dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/11/2003, 16h36
  4. [débutant] conversion int en hexa
    Par sergoid dans le forum C++Builder
    Réponses: 6
    Dernier message: 16/05/2003, 11h11
  5. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24

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