Expression reguliere

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Expression reguliere

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Expression reguliere

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Expression reguliere

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Expression reguliere

Message 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
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Expression reguliere

Message 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...
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Expression reguliere

Message par Backup »

...............
Dernière modification par Backup le ven. 30/sept./2011 20:09, modifié 1 fois.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Expression reguliere

Message 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 !!
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Expression reguliere

Message par graph100 »

Es-ce que vous pensez que c'est un bug ? ou bien le comportement voulu ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Expression reguliere

Message 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 :)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Expression reguliere

Message 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 ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Expression reguliere

Message par graph100 »

Il faudrait l'avis de Fred la-dessus. Dois-je aller poster ça sur le english fofo ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Expression reguliere

Message par djes »

Oui, ça ne fonctionne pas, peut-être qu'il y a une astuce. Tu as regardé sur le forum anglais?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Expression reguliere

Message par djes »

Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Expression reguliere

Message 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.
Dernière modification par graph100 le sam. 18/juin/2011 19:10, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Expression reguliere

Message par djes »

Nickel :)
+1 pour le natif
Répondre