[RESOLU] Regex et ReplaceRegularExpression

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

[RESOLU] Regex et ReplaceRegularExpression

Message par Progi1984 »

Salut à tous, travaillant sur Moebius, je chercher à remplacer tous les appels (tels _ProcedureX) par le nom de la fonction. Mais j'ai un probleme car
_Procedure2, _Procedure20 et _Procedure 25 seront remplacé par le nom de la fonction affilié à _Procedure2.

Donc je me penche vers les regex :

Code : Tout sélectionner

  If CreateRegularExpression(0, "_Procedure20[^0-9]",0) = 0
    Debug RegularExpressionError()
    End
  EndIf
  InitString.s = "_Procedure2"+Chr(13)
  InitString.s + "_Procedure2"+Chr(13)+Chr(10)
  InitString.s + "_Procedure2"+Chr(10)
  Debug ReplaceRegularExpression(0, InitString, "ALPHA")
 
  InitString.s = "_Procedure2 "+Chr(13)
  InitString.s + "_Procedure2 "+Chr(13)+Chr(10)
  InitString.s + "_Procedure2 "+Chr(10)
  Debug ReplaceRegularExpression(0, InitString, "ALPHA")
 
  InitString.s = "_Procedure20"+Chr(13)
  InitString.s + "_Procedure20"+Chr(13)+Chr(10)
  InitString.s + "_Procedure20"+Chr(10)
  Debug ReplaceRegularExpression(0, InitString, "ALPHA")
 
  InitString.s = "_Procedure20 "+Chr(13)
  InitString.s + "_Procedure20 "+Chr(13)+Chr(10)
  InitString.s + "_Procedure20 "+Chr(10)
  Debug ReplaceRegularExpression(0, InitString, "ALPHA")
 
  InitString.s = "_Procedure203"+Chr(13)
  InitString.s + "_Procedure203"+Chr(13)+Chr(10)
  InitString.s + "_Procedure203"+Chr(10)
  Debug ReplaceRegularExpression(0, InitString, "ALPHA")
 
  InitString.s = "_Procedure203 "+Chr(13)
  InitString.s + "_Procedure203 "+Chr(13)+Chr(10)
  InitString.s + "_Procedure203 "+Chr(10)
  Debug ReplaceRegularExpression(0, InitString, "ALPHA")

J'ai ce bout de code mais comme vous pouvez le voir sur la troisième ligne de résultats : il me supprime le chr(13) ou dans la quatrieme ligne l'espace aprés.

Aidez moi, svp :)

Merci d'avance
Dernière modification par Progi1984 le jeu. 05/févr./2009 9:33, modifié 2 fois.
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

Message par zaphod »

est-ce que c'est ce que tu cherches ?

Code : Tout sélectionner

InitString.s = "_Procedure2"+Chr(13) 
  InitString.s + "_Procedure2"+Chr(13)+Chr(10) 
  InitString.s + "_Procedure2"+Chr(10) 
  If CreateRegularExpression(0, "_Procedure20[^0-9]",#PB_RegularExpression_DotAll) 
    Debug ReplaceRegularExpression(0, InitString, "ALPHA") 
  Else 
    Debug RegularExpressionError() 
  EndIf 
  
  InitString.s = "_Procedure2 "+Chr(13) 
  InitString.s + "_Procedure2 "+Chr(13)+Chr(10) 
  InitString.s + "_Procedure2 "+Chr(10) 
  If CreateRegularExpression(0, "_Procedure20[^0-9]",#PB_RegularExpression_DotAll) 
    Debug ReplaceRegularExpression(0, InitString, "ALPHA") 
  Else 
    Debug RegularExpressionError() 
  EndIf 
  
  InitString.s = "_Procedure20"+Chr(13) 
  InitString.s + "_Procedure20"+Chr(13)+Chr(10) 
  InitString.s + "_Procedure20"+Chr(10) 
  If CreateRegularExpression(0, "_Procedure20[^0-9]",#PB_RegularExpression_DotAll) 
    Debug ReplaceRegularExpression(0, InitString, "ALPHA") 
  Else 
    Debug RegularExpressionError() 
  EndIf 
  
  InitString.s = "_Procedure20 "+Chr(13) 
  InitString.s + "_Procedure20 "+Chr(13)+Chr(10) 
  InitString.s + "_Procedure20 "+Chr(10) 
  If CreateRegularExpression(0, "_Procedure20[^0-9]",#PB_RegularExpression_DotAll) 
    Debug ReplaceRegularExpression(0, InitString, "ALPHA") 
  Else 
    Debug RegularExpressionError() 
  EndIf 
  
  InitString.s = "_Procedure203"+Chr(13) 
  InitString.s + "_Procedure203"+Chr(13)+Chr(10) 
  InitString.s + "_Procedure203"+Chr(10) 
  If CreateRegularExpression(0, "_Procedure20[^0-9]",#PB_RegularExpression_DotAll) 
    Debug ReplaceRegularExpression(0, InitString, "ALPHA") 
  Else 
    Debug RegularExpressionError() 
  EndIf 
  
  InitString.s = "_Procedure203 "+Chr(13) 
  InitString.s + "_Procedure203 "+Chr(13)+Chr(10) 
  InitString.s + "_Procedure203 "+Chr(10) 
  If CreateRegularExpression(0, "_Procedure20[^0-9]",#PB_RegularExpression_DotAll) 
    Debug ReplaceRegularExpression(0, InitString, "ALPHA") 
  Else 
    Debug RegularExpressionError() 
  EndIf 
Z@ph0d
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Non, cela ne régle pas le problème, car comme tu pe le voir dans le debug.

A la ligne 3, il manque les deux symboles de chr(13)
A la ligne 4, il manque les espaces après ALPHA.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Bon, on m'a répondu sur le forum EN.

Regex, c'est énorme :

Code : Tout sélectionner

CreateRegularExpression(0, "_Procedure20(?=\s)",0) 
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Ca ne marche pas totalement, ou je n'ai pas bien compris:

Code : Tout sélectionner

Text$ = "aa Test_Procedure20(coucou) bb Test_Procedure205(coucou) cc Test_Procedure20 (coucou)"
CreateRegularExpression(0, "_Procedure20(?=\s)",0) 
Debug ReplaceRegularExpression(0, Text$, "_xxx") 
Voila ma solution:

Code : Tout sélectionner

Text$ = "aa Test_Procedure20(coucou) bb Test_Procedure205(coucou) cc Test_Procedure20 (coucou)"
CreateRegularExpression(0, "_Procedure20(\s)*\(",0) 
Debug ReplaceRegularExpression(0, Text$, "_xxx(") 
/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

En me repenchant sur un problème de compilation lors de la compilation d'une de mes libs, je suis tombé sur un problème dû au regex créé ici.

Et comme je m'en rends compte, je n'avais pas vu ton post, lionel_om.

Tu as raison, le bug est là !

Par contre, le problème dans ton regex est la dernière parenthèse lors du remplacement. Je ne peux pas savoir dans le code asm si il y a ou non une parenthèse aprés... Aurais tu une piste à me conseiller ?
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Progi1984 a écrit :Par contre, le problème dans ton regex est la dernière parenthèse lors du remplacement. Je ne peux pas savoir dans le code asm si il y a ou non une parenthèse aprés... Aurais tu une piste à me conseiller ?
C'est à dire ?

/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Dans le regex, tu cherches si dans la zone recherchée si le dernier élément est une parenthèse.

En fait, il faut que je recherche le _Procedure20 et ne remplace que celui et non _Procedure205.

Code : Tout sélectionner

Text$ = "aa Test_Procedure20(coucou) bb Test_Procedure205 (coucou) cc Test_Procedure20 (coucou) cc Test_Procedure20"+Chr(13)+Chr(10)+"(coucou)"
CreateRegularExpression(0, "_Procedure20[^0-9]",0)
Debug ReplaceRegularExpression(0, Text$, "_xxx") 
J'avais pensé à ca mais ca remplace les parenthèses et je reviens vers mon code original. Merde !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Je ne comprend toujours pas... Pourquoi ma solution ne marche pas?
Tu veux bien remplacer toutes occurrences de "_Procedure20", par autre chose... Et à chaque fois, il doit y avoir une parenthèse ouvrante après le nom sinon ça pourrais être un nom de variable ou je ne sais quoi... Par contre cette parenthèse peut être décalée avec des espaces ou tabulations ou retour à la ligne...

Du coup je ne comprend pas pourquoi tu chercher à voir s'il n'y pas un un autre chiffre derrière le nom...

/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Le problème est ta dernière parenthèse.

Ce n'est pas du PureBasic que je parse mais de l'assembleur.

Ce qui fait qu'à la fin de _PureBasic20, je n'ai pas de parenthèse.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Tu as quoi alors ? Un espace ou un retour à la ligne ?
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

lionel_om a écrit :Tu as quoi alors ? Un espace ou un retour à la ligne ?
J'ai quoi derrière : _Procedure20 : tout sauf des chiffres...
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Code : Tout sélectionner

Text$ = "aa Test_Procedure20(coucou) bb Test_Procedure205 (coucou) cc Test_Procedure20 (coucou) cc Test_Procedure20"+Chr(13)+Chr(10)+"(coucou)"
CreateRegularExpression(0, "(?Us)_Procedure20(?=\({1})",0)
Debug ReplaceRegularExpression(0, Text$, "_xxx") 
C'est sans doute ça que tu cherches comme solution alors. Vive le "look ahead" !!!

/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Presque parceque dans l'exemple précédent tous les _Procedure20 devaient etre remplacé par xxx, ne laissant que le 205 seul...

Peux tu expliquer le regex précédent ?
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Je n'y arrives pas. En fait il manque des fonctions à PB pour faire ça je pense. Car normalement avec les expressions régulières, y'a le principe des groupe capturant ou non. Dans PB ils n'ont plus aucune valeur car on ne peut pas réutiliser les groupes.
J'ai déjà soulevé ce problème ici.

Avec le look ahead de cette version d'Ereg, j'ai l'impression qu'on ne peut pas définir la profondeur de recherche et donc il va rechercher un caractère bien plus loin dans la chaîne...
Ma dernière tentative qui aurait du marcher était celle là:

Code : Tout sélectionner

Text$ = "aa Test_Procedure20(coucou) bb Test_Procedure205 (coucou) cc Test_Procedure20 (coucou) cc Test_Procedure20"+Chr(13)+Chr(10)+"(coucou)"
CreateRegularExpression(0, "_Procedure20(?!\d)",0)
Debug ReplaceRegularExpression(0, Text$, "_xxx") 
Le look ahead permet d'aller voir plus loin dans la chaîne si on trouve (ou pas, selon notre souhait) un pattern matchant. Normalement on peut définir cette profondeur dans les langages LR/LL/LR1... (dont les Regex font partis). Mais dans PB ca ne semble pas être le cas. Normalement ca doit se faire tout simplement avec les groupes capturant.

C'est vraiment dommage qu'il n'y ait pas ça dans PB. Je pense qu'il va falloir que tu te fasses ta propre fonction de recherche dans les chaînes. Mais vu que tu recherches qqchose de très déterminé/fixé, ça ne devrait pas être trop dur à faire: la partie du nom de fonction n'est pas une Regex en elle-même, mais juste une chaîne de caractère définie.

Sinon, sur le forum anglais, y'avait un gars qui m'avait bien aidé qd j'avais eu mon problème: AND51. Voici le post en question: ici

J'espère avoir était clair. Pour plus d'infos sur les Regex, les autres langages de ce type et les look ahead/behind, va faire un tour sur wikipedia ou via google...

Bon courage
/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre