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
Si cela peut t'aider

un outil pour tester des expressions régulières
http://www.purebasic.fr/french/viewtopic.php?f=6&t=9948

un bon site d'explication
http://www.siteduzero.com/tutoriel-3-14 ... e-2-2.html

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é 8) *

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 :roll: )

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