Perl regex Hexa Utf8

Résolu/Fermé
dmganges Messages postés 150 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 25 novembre 2013 - 13 juin 2012 à 11:28
dmganges Messages postés 150 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 25 novembre 2013 - 13 juin 2012 à 15:07
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 !
A voir également:

3 réponses

blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
Modifié par blux le 13/06/2012 à 11:40
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"
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
13 juin 2012 à 11:45
Salut,

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

$Lig =~ s/(\x{0627}\x{0644}..)\x{0651}/$1/g;
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
Modifié par blux le 13/06/2012 à 11:47
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...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
13 juin 2012 à 11:53
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 ;-)))
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
13 juin 2012 à 11:56
J'ai trouvé ça : 8.10. Références arrières
0
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 !
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
13 juin 2012 à 14:05
Donc, tu as mis quoi, au juste ?
Ca marche ?
0
Pardon !
Non ça ne marche pas,
à l'exécution (lien vers ci-joint.com) non traduits ici :

ça intercale des ( ) ....
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
13 juin 2012 à 14:21
Il te suggère de remplacer les \1, \2 par des $1, $2...
Peux-tu essayer ?
0
dmganges Messages postés 150 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 25 novembre 2013 19
13 juin 2012 à 14:39
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 !
0
dmganges Messages postés 150 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 25 novembre 2013 19
13 juin 2012 à 14:55
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...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
13 juin 2012 à 14:57
Happy for you et merci du retour.

Par contre avais-tu essayé ça ?
0
dmganges Messages postés 150 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 25 novembre 2013 19
13 juin 2012 à 15:07
$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 !!!
0