Page 1 sur 2
Expression reguliere
Publié : dim. 02/mai/2010 10:55
par GallyHC
Bonjour,
J'aurais besoin d'une petite aide. J'ai une expression reguliere pour colorise du texte, mais je voudrais exclure tout ce qui ce trouve entre " ".
Voila l'expression : '/(\b'.$vars_pbcm[$k].'\b)/i' (oui le code est du PHP, mais je penses que les expression sont partout les meme.
Merci d'avance,
GallyHC
Re: Expression reguliere
Publié : mar. 04/mai/2010 12:10
par GallyHC
Bonjour,
Visiblement personne ici a plus de connaissance que moi sur ce truc, bon tant pis, je vais continuer a essaye de comprendre.
Cordialement,
GallyHC
Re: Expression reguliere
Publié : mar. 04/mai/2010 14:40
par Le Soldat Inconnu
Re: Expression reguliere
Publié : mar. 04/mai/2010 15:22
par djes
LSI> Très bon site, merci
Code : Tout sélectionner
g.s = Chr(34)
machaine.s = "remplacez " + g + "moa" + g
Debug machaine
If CreateRegularExpression(0, g + ".+" + g)
Result$ = ReplaceRegularExpression(0, machaine, g + g)
Debug Result$
Else
Debug RegularExpressionError()
EndIf
Re: Expression reguliere
Publié : ven. 17/juin/2011 23:35
par graph100
* je prend ma pelle est ma pioche *** Et hop, topic déterré

*
Un de mes programmes ayant planté de façon assez chiante, je me suis dis que les expressions régulière peuvent me tirer de mes soucis.
Je parcours les excellents tutoriels cités ci-dessus, et découvre avec émerveillement que les regex font exactement ce que je cherche à faire.
Hop, je prend les outils du Soldat pour créer facilement mes regex, et lorsqu'elles fonctionnent bien, PAF !! Un fat coup dans ma gueule et dans mon moral
Mes tests ne fonctionnent pas de la manière prévue avec ReplaceRegularExpression(), apparement les '$0', '$1', et autres, ne sont pas pris en compte. Ce qui invalide une des meilleures possibilités des expressions régulière -_-
Que dis-je, la meilleure.
Le tutoriel super a écrit :En effet, retenez bien ceci : à chaque fois qu'il y a une parenthèse, cela crée une variable appelée $1 (pour la première parenthèse), $2 pour la seconde etc...
On va se servir ensuite de ces variables pour modifier la chaîne (faire un remplacement).
Eh bah NON, c'est pas pour nous, ou alors je m'y prend mal, (je que je voudrais penser

)
Code : Tout sélectionner
CreateRegularExpression(0, "[a-z]")
res$ = ReplaceRegularExpression(0, "ZaZi", " + un '$0' minuscule ")
Debug res$
Ce code devrais donner sur le Debug : "Z + un 'a' minuscule Z + un 'i' minuscule"
Voila, j'en pleurerais presque...
Re: Expression reguliere
Publié : sam. 18/juin/2011 11:18
par Backup
...............
Re: Expression reguliere
Publié : sam. 18/juin/2011 12:43
par graph100
non non Dobro, ça c'est du bricollage. Je ne comprend pas pourquoi Fred n'ont pas codé la fonction comme elle devrais fonctionner avec PCRE.
C'est d'une puissance !!! J'en frémis.
Alors j'explique le principe pour que ce soit clair :
Dans une regex, CHAQUE parenthèse ouvrante créé une variable nommé $+un nombre de 1 à 99.
$0 représente toute l'expression régulière.
Du coup, on peux utiliser un moteur de remplacement extrêmement puissant !!
Re: Expression reguliere
Publié : sam. 18/juin/2011 15:33
par graph100
Es-ce que vous pensez que c'est un bug ? ou bien le comportement voulu ?
Re: Expression reguliere
Publié : sam. 18/juin/2011 16:09
par Backup
graph100 a écrit :
Le tutoriel super a écrit :En effet, retenez bien ceci : à chaque fois qu'il y a une parenthèse, cela crée une variable appelée $1 (pour la première parenthèse), $2 pour la seconde etc...
On va se servir ensuite de ces variables pour modifier la chaîne (faire un remplacement).
.
ben ce Tuto est manifestement fait pour le PHP
le Php permet des grands eccarts avec les variables
comme ici justement
$0 est une variable PHP ..
le php permet surement de récuperer ce qui se trouve entre parenthese
mais ne je croix pas que ce soit une option des Regex
mais plutot du PHP

Re: Expression reguliere
Publié : sam. 18/juin/2011 16:20
par graph100
Ah ha !
Bon, un autre lien utile, le type parle des assertions. Et il introduit aussi la possibilité de modifier les options à la volée.
ET DONC : d'utiliser des options que PB ne prend pas en compte pour le moment :
- insensibilité à la casse ( i )
- ungreedy ( U )
- etc ..
http://www.lumadis.be/regex/tuto_pcre.php
pour les options à la volée : "(?U)" pour activer et (?-U) pour déactiver (ou U est l'option : UnGreedy)
Enfin, effectivement ces tutos concernent une implémentation php. Cependant, ne trouvez vous pas qu'il serais utile de pourvoir utiliser les parenthèses capturantes ?
Re: Expression reguliere
Publié : sam. 18/juin/2011 16:29
par graph100
Il faudrait l'avis de Fred la-dessus. Dois-je aller poster ça sur le english fofo ?
Re: Expression reguliere
Publié : sam. 18/juin/2011 16:40
par djes
Oui, ça ne fonctionne pas, peut-être qu'il y a une astuce. Tu as regardé sur le forum anglais?
Re: Expression reguliere
Publié : sam. 18/juin/2011 16:44
par djes
Re: Expression reguliere
Publié : sam. 18/juin/2011 17:24
par graph100
tu sais que je t'aime toi

j'avais commencé un wrapper à partir d'une DLL ...
Voila un code qui devrais avoir le même comportement. Je vais essayer de terminer mon programme avec. (J'ai juste modifier le code trouver sur le 1er post que tu pointe)
[EDIT] : code mis à jour
Code : Tout sélectionner
ImportC ""
pcre_exec(*pcre,*extra,subject.s,length,startoffset,options,*ovector,ovecsize)
EndImport
Procedure.s BackrefReplaceRegularExpression(regexp_handle, string.s, replacement.s, maximum_reference.l = 10) ; 0 <= maximum_reference <= 99
Static Dim pcre_results(202)
depart = 0
While pcre_exec(PeekL(regexp_handle), 0, string, Len(string), depart, 0, @pcre_results(), 202) > 0
; pcre_exec(PeekL(regexp_handle), 0, string, Len(string), pcre_results(1), 0, @pcre_results(), 202)
rpl.s = replacement
p = pcre_results(0)
q = pcre_results(1)
If FindString(replacement,"$0", 1)
rpl = ReplaceString(rpl, "$0", PeekS(@string + p, q - p))
EndIf
tableau_ref = 2
For _a = 1 To maximum_reference
tag$ = "$" + Str(_a)
If FindString(replacement, tag$, 1)
p1 = pcre_results(tableau_ref)
q1 = pcre_results(tableau_ref + 1)
rpl = ReplaceString(rpl, tag$, PeekS(@string + p1, q1 - p1))
EndIf
tableau_ref + 2
Next
; If FindString(replacement,"\2",1)
; p1=pcre_results(4)
; q1=pcre_results(5)
; rpl=ReplaceString(rpl,"\2",PeekS(@string+p1,q1-p1))
; EndIf
; If FindString(replacement,"\3",1)
; p1=pcre_results(6)
; q1=pcre_results(7)
; rpl=ReplaceString(rpl,"\3",PeekS(@string+p1,q1-p1))
; EndIf
depart = p + Len(rpl)
string = Left(string, p) + rpl + Right(string, Len(string) - q)
Wend
ProcedureReturn string
EndProcedure
rh = CreateRegularExpression(0," t(.*?)e(.*?) ")
Debug BackrefReplaceRegularExpression(rh,"As they functions tried importing them through the tset ","________$0")
Néanmoins, en natif se serais quand même mieux.
Re: Expression reguliere
Publié : sam. 18/juin/2011 18:14
par djes
Nickel

+1 pour le natif