Page 1 sur 2
[RESOLU] Regex et ReplaceRegularExpression
Publié : mer. 04/févr./2009 14:29
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
Publié : mer. 04/févr./2009 15:05
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
Publié : mer. 04/févr./2009 15:15
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.
Publié : jeu. 05/févr./2009 9:36
par Progi1984
Bon, on m'a répondu sur le forum EN.
Regex, c'est énorme :
Publié : lun. 09/févr./2009 9:26
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
Publié : mer. 13/mai/2009 22:54
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 ?
Publié : jeu. 14/mai/2009 0:07
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
Publié : jeu. 14/mai/2009 6:30
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 !
Publié : jeu. 14/mai/2009 9:22
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
Publié : jeu. 14/mai/2009 12:33
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.
Publié : jeu. 14/mai/2009 15:39
par lionel_om
Tu as quoi alors ? Un espace ou un retour à la ligne ?
Publié : jeu. 14/mai/2009 17:58
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...
Publié : jeu. 14/mai/2009 20:34
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
Publié : ven. 15/mai/2009 6:20
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 ?
Publié : ven. 15/mai/2009 10:48
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