PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Fonctionnement des RegEx
Fonctionnement des RegEx
Débuté par Gilles, 24 jan. 2015 19:06 - 1 réponse
Membre enregistré
160 messages
Popularité : +1 (3 votes)
Posté le 24 janvier 2015 - 19:06
Bonjour,

Le champ Texte2 contient
<div><font Style="Font: 11px Verdana; color:#000000;">Ceci est</font><font Style="Font: 11px @Batang; color:#000000;">un</font><font Style="Font: 11px Verdana; color:#000000;">test.<br/></font></div>

Le code de mon bouton
LOCAL
sTmp est unechaîne
tResA,tResB sont destableauxdynamiques
sRegExp est unechaîne=".*(Font: [0-9]*px [ ,@,a-z,A-Z]*;).*"

tResA=alloueruntableau de0chaînes
tResB=alloueruntableau de0chaînes
//Texte2 = RTFVersHTML(Texte1)

SIVérifieExpressionRégulière(Texte2,sRegExp,tResA)ALORS
Info(tResA..Occurrence)
FIN

J'obtiens 1. J'ai lu que VérifieExpressionRégulière ne gère pas la non-greedy .*? Et cela semble être effectivement le cas.

A moins que sRegEx soit mal écrite. Ce serait un moindre mal.

Si tel n'est pas le cas, donc en greedy, je dois supprimer normalement les correspondances dans Texte2. J'ai pensé faire une boucle sur le VérifieExpressionRégulière en supposant que l'opérateur .*, comme c'est normalement la règle, cherche à maximiser son impact, c'est à dire que s'il a le choix entre deux correspondances, il propose la plus longue, celle qui contient le plus de caractères.

Or il semble proposer systématiquement la dernière rencontrée.

<div><font Style="Font: 11px Arial; color:#000000;">Test</font><font Style="Font: 11px Arial Black; color:#000000;">N° 1<br/></font></div>

Renvoie : Font: 11px Arial Black;

<div><font Style="Font: 11px Arial Black; color:#000000;">Test</font><font Style="Font: 11px Arial; color:#000000;">N° 1<br/></font></div>

Renvoie : Font: 11px Arial;

Ce n'est pas grave dans mon cas car si je supprime "Font: 11px Arial;", il n'y a pas d'impact sur un "Font: 11px Arial Black;" grâce à la présence du ";"

Mais j'aimerais comprendre un peu mieux le fonctionnement de Windev. Je bugge ou c'est "particulier" à Windev ?

>Cordialement. Gilles
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 25 janvier 2015 - 00:52
hello,
tout le problème vient du fait que VérifieExpressionRégulière ne connaît pas la recherche globale.
Avec windev pour travailler avec les expressions régulières on peut utiliser l'objet automation vbscript.regexp.
Voici un exemple qui va chercher toutes les polices dans la chaîne que tu as proposée :
MonFiltre est unechaîne
MonRegexp est unobjet automation"vbscript.regexp"
objMatches est unobjet automationdynamique
MaChaineATester est unechaîne="<div><font Style=""Font: 11px Verdana; color:#000000;"">Ceci est </font><font Style=""Font: 11px @Batang; color:#000000;"">un</font><font Style=""Font: 11px Verdana; color:#000000;""> test.<br /></font></div>"

MonFiltre="Font: [0-9]*px [ ,@,a-z,A-Z]*;"
MonRegexp>>GLOBAL=Vrai// on cherche toutes les occurrences
// on recherche les motifs qui sont sous la forme du Filtre
MonRegexp>>Pattern=MonFiltre
objMatches=MonRegexp>>Execute(MaChaineATester)// on recherche tous les motifs
SIobjMatches>>Count=0ALORS
Info("pas de police trouvée ")
SINON
POUR y=0_A_ objMatches>>Count-1
Trace(" Police "+y+" : "+objMatches>>Item(y)>>value)
FIN
FIN


--
>Ami calmant, J.P