Page 2 sur 2
Publié : ven. 15/mai/2009 11:20
par Backup
excuse ma naïveté, mais pourquoi ne pas avoir utilisé
Position = FindString(Chaine$, ChaineCherchee$, PositionDepart)
et
String$ = ReplaceString(Chaine$, ChaineCherchee$, ChaineRemplacee$ [, Mode [, PositionDepart]])
???
Publié : ven. 15/mai/2009 12:41
par Backup
j'ai fait une petite procedure recursive
regarde la :
http://www.purebasic.fr/french/viewtopi ... 7859#97859
Publié : ven. 15/mai/2009 17:56
par cederavic
Ben.. ça marche avec les regex :
Code : Tout sélectionner
Text$ = "(A) : Test_Procedure20(coucou) (B) : Test_Procedure20 (coucou) (C) : Test_Procedure20"+Chr(13)+Chr(10)+"(coucou) (D) : Test_Procedure20 (coucou) (E) : Test_Procedure20 "+Chr(13)+Chr(10)+Chr(13)+Chr(10)+Chr(13)+Chr(10)+"(coucou)"
Text$ + "(A') : Test_Procedure201(coucou) (B') : Test_Procedure202 (coucou) (C) : Test_Procedure20"+Chr(13)+Chr(10)+"(coucou) (D') : Test_Procedure203 (coucou) (E') : Test_Procedure204 "+Chr(13)+Chr(10)+Chr(13)+Chr(10)+Chr(13)+Chr(10)+"(coucou)"
If CreateRegularExpression(0, "_Procedure20 {0,}?["+Chr(13)+Chr(10)+"]{0,}?\(")
Debug Text$
Debug ReplaceRegularExpression(0, Text$, "_xxx(")
EndIf
Biensur c'est specifique à la syntax d'une fonction nom_de_la_fonction[plusieur espaces ou non](
Mais le resultat est là...
Publié : ven. 15/mai/2009 18:03
par lionel_om
Dobro a écrit :excuse ma naïveté, mais pourquoi ne pas avoir utilisé
Position = FindString(Chaine$, ChaineCherchee$, PositionDepart)
et
String$ = ReplaceString(Chaine$, ChaineCherchee$, ChaineRemplacee$ [, Mode [, PositionDepart]])
???
En fait c'est conditionné par le caractère après le motif à chercher. Donc un simple ReplaceString ne marchera pas car il risque de remplacer trop d'occurrences.
Voilà un code qui marche:
Code : Tout sélectionner
Procedure.s SpecialReplaceString(Text$, FindMe$, ReplaceBy$)
Protected index.l = 1, *char.c
Protected lFindMe.l = Len(FindMe$), lReplBy.l = Len(ReplaceBy$)
index = FindString(Text$, FindMe$, index)
While index
*char = PeekC(@Text$ + lFindMe + index - 1)
If *char < '0' Or *char > '9'
Text$ = Left(Text$,index-1) + ReplaceBy$ + Right(Text$, 1+Len(Text$)-(index+lFindMe))
Debug Text$
index + lReplBy + 1
Else
index + lFindMe + 1
EndIf
index = FindString(Text$, FindMe$, index)
Wend
ProcedureReturn Text$
EndProcedure
Text$ = "aa Test_Procedure20(coucou) bb Test_Procedure205 (coucou) cc Test_Procedure20 (coucou) cc Test_Procedure20"+Chr(13)+Chr(10)+"(coucou)"
SpecialReplaceString(Text$, "_Procedure20", "_xxx")
Je l'ai fait très vite fait. Il peut y avoir des effets de bords...
/Lio
Publié : ven. 15/mai/2009 18:07
par lionel_om
cederavic a écrit :Ben.. ça marche avec les regex :
...
Biensur c'est specifique à la syntax d'une fonction nom_de_la_fonction[plusieur espaces ou non](
Mais le resultat est là...
Le problème c'est que tu ne peux pas remplacer par "_xxx
(" car il n'y a pas forcément cette parenthèse...
Progi1984 a écrit :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é : ven. 15/mai/2009 18:21
par Backup
lionel_om a écrit :
Voilà un code qui marche

j'avais deja fait une reponse dans ce genre :
j'ai pas testé ta version , mais il est probabble qu'elle soit plus rapide

Publié : ven. 15/mai/2009 18:58
par Progi1984
Dobro a écrit :excuse ma naïveté, mais pourquoi ne pas avoir utilisé
Position = FindString(Chaine$, ChaineCherchee$, PositionDepart)
et
String$ = ReplaceString(Chaine$, ChaineCherchee$, ChaineRemplacee$ [, Mode [, PositionDepart]])
???
Pas de problème...
FindString => parceque je voulais me faciliter la vie avec les regex

.
RepaceString => à cause du problème de remplacement de 205 en xx5.
Je vais voir lequel va être le plus rapide entre Dobro & lionel_om.
Mais j'aime bien celui de lionel_om car cela correspond plus à mon problème.
Merci à vous tous...
Publié : ven. 15/mai/2009 19:22
par Backup
.........
Publié : ven. 15/mai/2009 23:42
par cederavic
Le problème c'est que tu ne peux pas remplacer par "_xxx(" car il n'y a pas forcément cette parenthèse...
C'est bien pour des appels de fonctions non?
De toute façon il faut bien un character pour delimiter la fin d'un "mot"...
Publié : sam. 16/mai/2009 7:44
par Progi1984
@Dobro: Toujours rapide et valide en réponse !
@cederavic: Ce code est pour parser de l'ASM, donc pas obligé qu'il y ait une parenthèse derrière cet appel.