[RESOLU] Regex et ReplaceRegularExpression

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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]])
???
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

j'ai fait une petite procedure recursive :)

regarde la :
http://www.purebasic.fr/french/viewtopi ... 7859#97859
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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à...
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

lionel_om a écrit : Voilà un code qui marche

:lol: j'avais deja fait une reponse dans ce genre :
j'ai pas testé ta version , mais il est probabble qu'elle soit plus rapide :)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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 :lol:.
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...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

.........
Dernière modification par Backup le sam. 01/oct./2011 13:57, modifié 1 fois.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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"...
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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.
Répondre