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 une chaîne
tResA, tResB sont des tableaux dynamiques
sRegExp est une chaîne = ".*(Font: [0-9]*px [ ,@,a-z,A-Z]*;).*"

tResA = allouer un tableau de 0 chaînes
tResB = allouer un tableau de 0 chaînes
//Texte2 = RTFVersHTML(Texte1)

SI Vé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 une chaîne
MonRegexp est un objet automation "vbscript.regexp"
objMatches est un objet automation dynamique
MaChaineATester est une chaî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
SI objMatches>>Count = 0 ALORS
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