Perl regex Hexa Utf8 [Résolu/Fermé]

Signaler
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
-
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
-
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 :
$Lig =~ s/\x{0627}\x{0644}(.)(.)\x{0651}/\x{0627}\x{0644}(.)(.)/g;

Sauf que mon intuition est fausse bien sûr, la notation (.) est fausse !
Merci d'avance pour votre aide !

3 réponses

Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 075
Salut,

les références arrière ?

$Lig =~ s/\x{0627}\x{0644}(.)(.)\x{0651}/\x{0627}\x{0644}(\3)(\4)/g;
ou même
$Lig =~ s/\x{0627}\x{0644}(.)(.)\x{0651}/(\1)(\2)(\3)(\4)/g;
Non testé, donc SGDG ;-)

A+ blux
 "Les cons, ça ose tout.    
C'est même à ça qu'on les reconnait"
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 234
Salut,

On ne peut pas regrouper le tout en une seule ?
Du style :

$Lig =~ s/(\x{0627}\x{0644}..)\x{0651}/$1/g;
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 075
C'est vrai, on pourrait...
J'ai juste un doute sur les références arrières où je les vois affichées tantôt avec un $n, tantôt avec un \n...
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 234
D'après ce que j'en ai compris (je ne connais pas Perl), le "\n" est employé pour répéter le motif dans la sous-expression, alors que le "$n" s'emploie dans la partie droite d'une substitution.

Mais j'émets aussi des réserves sur ma conclusion ;-))

lami20j au secours ;-)))
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 234
J'ai trouvé ça : 8.10. Références arrières
D'abord MERCI blux, zipe31 & lami20j ( je ne doute pas...) !!!
de vous intéresser à mon pb, tout con (je suis découvert [blux] :-)))

Pardon zipe31 pour le mauvais choix de forum, et merci pour le transfert !

Voici ce que me retourne :
$Lig =~ s/\x{0627}\x{0644}(.)(.)\x{0651}/(\1)(\2)(\3)(\4)/g;

C:\Arabe>perl ess.pl
\1 better written as $1 at ess.pl line 1892.
\2 better written as $2 at ess.pl line 1892.
\3 better written as $3 at ess.pl line 1892.
\4 better written as $4 at ess.pl line 1892.
Use of uninitialized value $3 in concatenation (.) or string at ess.pl line 1892
, <$fh> line 1.
Use of uninitialized value $4 in concatenation (.) or string at ess.pl line 1892
, <$fh> line 1.

Et dans le scrolled-text d'exécution :
http://cjoint.com/?BFnnJZ0CXui

Voici ce que me retourne :
$Lig =~ s/\x{0627}\x{0644}(.)(.)\x{0651}/\x{0627}\x{0644}(\3)(\4)/g;

C:\Arabe>perl ess.pl
\3 better written as $3 at ess.pl line 1892.
\4 better written as $4 at ess.pl line 1892.

et dans le scrolled-text d'éxécution :
http://cjoint.com/?BFnnKMx4ogM


A titre info je n'ai pas de pb sur des transformations simples :

# 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; 
}



Encore MERCI !
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 075
Donc, tu as mis quoi, au juste ?
Ca marche ?
Pardon !
Non ça ne marche pas,
à l'exécution (lien vers ci-joint.com) non traduits ici :

ça intercale des ( ) ....
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 075
Il te suggère de remplacer les \1, \2 par des $1, $2...
Peux-tu essayer ?
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
C'est pareil,
j'ai porté $1 $2... dans la 1ère sugestion
$3 et $4 """"""""""""""""""""""""""""""""""""""""""

ET $1 à $4 dans la 2ème suggestion.

Pas mieux.
MERCI !
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
STOP !!!!

RÉSOLU !!!!

blux :

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

OK :

https://www.cjoint.com/?BFno3gLpCe7

J'avais laissé les parenthèses ($1) ($2)

D'autre part }$1$2
doivent être accolés sinon ajout d'espace dans la chaîne

Une super grand MERCI blux, zipe31...
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 234
Happy for you et merci du retour.

Par contre avais-tu essayé ça ?
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
$Lig =~ s/(\x{0627}\x{0644}..)\x{0651}/$1/g;

çà MARCHE IMPECCABLE !!!

ça va me servir pour des substitutions plus "compliquées"...

MERCI les gars vous êtes SUPER !!!