Page 1 sur 1
Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 10:30
par mad
Bonjour à tous,
J'ai un petit souci avec une expression rationnelle, avec l'implémentation lié à Purebasic, le voici :
J'ai une chaine :
aaaaabC ABc zbA abc
Sur cette chaîne je veux enlever le premier a de la ligne, soit le bleu.
L'expression que j'ai indiqué est la suivante ->
^a
J'effectue, avec la fonction ReplaceRegularExpression, un remplacement de caractère. je met un zéro par exemple...
Voici le code :
Code : Tout sélectionner
If CreateRegularExpression(0, "^a")
Result$ = ReplaceRegularExpression(0, "aaaaabC ABc zbA abc", "0")
Debug Result$ ; Will print "--- ABc --- abc"
Else
Debug RegularExpressionError()
EndIf
Et le retour, normalement il devrait remplacer que le premier caractère de la ligne par un zéro, mais ... voici le résultat.
00000bC ABc zbA abc
Pourtant cette expression à été vérifier et visiblement c'est la bonne. Est t'il possible d'avoir un problème d'implémentation ?
Avez vous déjà eu ce genre de problème ?
Merci a vous.
Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 13:33
par GallyHC
Bonjour,
Si c'est pour juste retire le premier caractère d'une chaine, je me dit que votre solution est "pourquoi faire simple quand un peu faire compliqué"...
Une autres solution simple :
Code : Tout sélectionner
Define stemp.s = "aaaaabC ABc zbA abc"
stemp = "0" + Right(stemp, Len(stemp) - 1)
Debug stemp
Cordialement,
GallyHC
Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 14:38
par Ar-S
Code : Tout sélectionner
t$ = "aaaaabC ABc zbA ABc"
If Left(t$,1) = "a"
t$ = Mid(t$,2,Len(t$)-1)
Debug t$
EndIf
Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 15:21
par mad
Salut les gars,
Malheureusement, c'est un peu plus compliqué que ça. En effet j'utilise les expressions rationnelles, afin de traiter des chaînes de caractères et de longueur inconnu.
De plus c'est pour un logiciel qui est interfacé avec des utilisateurs.
Si j'utilise des mid, left, field et split, je louperais surement des chaines... vous l'aurez compris...
Donc je dois utiliser les expressions rationnelles ...
Par contre si Fred (Laboureur hein

), passe par là, j'aurais aimé savoir pourquoi il utilisait la fonction pcre_dfa_exec au lieu de pcre_exec ... car du coup je pense que cela vient de là ...
Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 15:28
par Backup
mad a écrit :Malheureusement, c'est un peu plus compliqué que ça. En effet j'utilise les expressions rationnelles, afin de traiter des chaînes de caractères et de longueur inconnu.
aucune importance : la fonction len() est là pour ça
mad a écrit :De plus c'est pour un logiciel qui est interfacé avec des utilisateurs.
ha ? .... et alors ?
mad a écrit :Si j'utilise des mid, left, field et split, je louperais surement des chaines... vous l'aurez compris...
ben non

, je vois pas pourquoi tu louperai quelque chose ...
mad a écrit :Donc je dois utiliser les expressions rationnelles ...
si tu le dis
mad a écrit :Par contre si Fred (Laboureur hein

), passe par là, j'aurais aimé savoir pourquoi il utilisait la fonction pcre_dfa_exec au lieu de pcre_exec ... car du coup je pense que cela vient de là ...
je pense aussi , que les Expressions reguliere , en Purebasic , ne fonctionnent pas vraiment comme il faut ...
je crois que tu ne nous en dis pas assez ...
donne ici un exemple de texte , que tu n'arrive pas a résoudre en passant par les fonctions Chaines (String ) de Purebasic ....
ça permettra peut etre de te proposer une solution , auquel tu ne t'attends pas ...
apres tout, le Purebasic n'as pas toujours eu les expressions régulieres, et noous y arrivions quand meme

.... ou pas

Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 15:30
par Fred
J'utilise pas la fonction pcre_dfa_exec() mais bien pcre_exec()

. Le truc c'est que ma routine de remplacement ne prend pas en compte ce cas particulier. Je vais regarder ca.
Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 15:34
par Backup
GallyHc te donne une solution a ton probleme sans passer par les expressions reguliere
Code : Tout sélectionner
t$ = "aaaaabC ABc zbA ABc"
t$="0"+right(t$,len(t$)-1)
debug t$
d'ailleurs puisque Fred est la , tu ferai comment toi pour faire ceci ? (avec les REGEX )
Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 15:46
par Mesa
Un début de code :
Code : Tout sélectionner
If CreateRegularExpression(0, "^a+") ;^a{1,} marche aussi
; si le nombre de a est connu
Result$ = ReplaceRegularExpression(0, "aaaaabC ABc zbA abc", "0aaaa")
Debug Result$
; sinon
Dim Result2$(0)
a = ExtractRegularExpression(0, "aaaaabC ABc zbA abc", result2$())
Debug Result2$(0) ; ="aaaaa"
result3$="0" + RemoveString(Result2$(0), "a", #PB_String_CaseSensitive , 1, 1); = "0aaaa"
Debug Result3$
EndIf
Mesa.
Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 16:13
par Fred
Si la lib n'etait pas foireuse, le code original suffit pour gérer ca avec les regexp. J'imagine que son but n'est pas juste d'enlever le premier caractère d'une chaine, sinon il n'aurait pas utilisé ca.
Voici une nouvelle version de la lib qui devrait corriger le probleme: (windows x86)
http://www.purebasic.com/beta/windows_x ... Expression
Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 16:23
par Ar-S
Et voici une version sans Expression réguliere qui ne peut pas foirer.
Code : Tout sélectionner
; Initialisation ////////////////////
Global NewList chaine.s()
t$ = "aaaaabC ABc zbA aBcBA Aac"
Separateur.s = " "
NbrSeparateur.i = CountString(t$, Separateur)
Debug Str(NbrSeparateur) + " séparateurs"
Debug ""
ClearList(chaine())
; Vérification de la chaine pour voir si elle se termine par un espace ou pas. Ainsi dans les 2 cas ça marche. (je suis parano oui ;)
Test.s = ReverseString(t$)
Car.s = Left(Test,1)
If Car = " "
NbrSeparateur - 1
EndIf
; traitement ////////////////////
For i = 1 To NbrSeparateur + 1
mot.s = StringField(t$, i, Separateur)
; Detection ///////////////////
If Left(mot,1) = "a"
mot = Mid(mot,2,Len(mot)-1)
EndIf
AddElement(chaine())
chaine() = mot
Next
; resultat //////////////////////
ForEach chaine()
Debug chaine()
Next
Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 16:24
par mad
Bonjour Mesa, Effectivement, il est possible d’altérer les expressions, mais les utilisateurs s'attendent à du compatible perl.
Bon ... Je vois que mon copain, Dobro est toujours là pour faire des remarques intéressantes...

Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 16:25
par mad
Fred a écrit :Si la lib n'etait pas foireuse, le code original suffit pour gérer ca avec les regexp. J'imagine que son but n'est pas juste d'enlever le premier caractère d'une chaine, sinon il n'aurait pas utilisé ca.
Voici une nouvelle version de la lib qui devrait corriger le probleme: (windows x86)
http://www.purebasic.com/beta/windows_x ... Expression
+1
Merci pour la librairie.
Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 16:32
par mad
Fred, je confirme ça marche beaucoup mieux pour mon expression.
Si tu veux je peux te tester la libraire. Si tu le souhaites tu peux me filer ton plan de test.
Merci encore.
Re: Expressions Rationnelle et comportement PCRE
Publié : jeu. 23/août/2012 17:38
par Fred
Si tu trouves d'autres problemes, n'hesites pas.