Salut.
Alors pour ma part, l'exemple que je t'ai fourni est prévu pour fonctionner de façon "stricte" avec l'exemple de chaîne que tu as donné :
"toto = 1 and titi != 3 or tata = 4" dont on ne connait pas le nombre de "or" et de "and"
Envoyé par
jeremdu94
D'après ce que j'ai compris, tu prends un premier enregistrement où tu places les valeurs dans name, operator et value. Puis tu cherches 0 ou n fois un and ou or que tu places dans logicalOperator suivi de de valeurs que tu mets dans name, operator et value.
Me trompe-je?
C'est exactement ça : mon expression impose la présence d'au moins une séquence du type :
toto = 1
correspond à
^(?<name>\w+)(\s(?<operator>=|!=)\s)(?<value>\d+)
Puis elle récupère une par une les autres :
and titi != 3 PUIS or tata = 4 etc.
correspond à
(\s(?<logicalOperator>and|or)\s(?<name>\w+)(\s(?<operator>=|!=)\s)(?<value>\d+))*$
Envoyé par
jeremdu94
Bon je ne maitrise pas encore tout par manque de pratique mais j'ai compris pas mal de choses, ma plus grande découverte à été que les expressions régulières sont "greedy" ce qui posait problème dans mon cas.
Si tu utilises plein de fois la même regex, tu peux la compiler, ça améliore les performances :
Regex myRegex = new Regex("^(.*)$", RegexOptions.Compiled);
Envoyé par
jeremdu94
Pour swif79, grâce à toi j'ai découvert qu'il pouvait y avoir plusieurs "matches" qui contiennent plusieurs valeurs. Alors que moi je croyais qu'il n'y avait toujours qu'un match avec toutes les valeurs à la suite.
<modeCommercial>Un outil comme celui que je t'ai conseillé te montre tout de suite ce genre de chose </modeCommercial>
Envoyé par
jeremdu94
Si je peux rajouter un détail, l'opérateur peut-être autre chose que = ou !=, cela peut-être un mot. La valeur n'est pas forcément un chiffre. C'est pourquoi j'ai dans l'idée de récupérer tous les caractères entre un and ou or, c'est plus simple.
Avec cette méthode, tu ne fais que reculer l'échéance, car après avoir récupéré tous ces caractères, il va falloir les retraiter pour distinguer les variables des opérateurs. Personnellement, en prenant l'exemple de l'opérateur, je ferais joujou avec les alias pour extraire directement l'opérateur ([\w=!<>]+ peut être un début...)
Envoyé par
jeremdu94
Voici donc l'état actuel de ma regexp:
Mon seul problème c'est que je n'arrive pas à envoyer un dernier match pour ce qu'il y a après le dernier 'and' ou 'or'.
Voilà ce que j'ai aussi essayé et qui ne me convient pas:
1 2 3
| ((.*)\s(or|and)\s)*(.*)
(.*)((and|or)(.*))*
(.*?)\s(or|and)\s(.*)$ |
Est ce que je suis toujours sur la bonne voie? parce que j'ai l'impression de m'éparpiller... Et si oui, est-il possible d'avoir un indice (sans code) pour savoir comment récupérer ma dernière partie de chaine.
Personnellement, je pense qu'effectivement tu t'éparpilles, tes regex sont beaucoup trop floues et génériques, et du coup tu perds tout l'intérêt des regex en procédant comme cela, mais ce n'est que mon avis .
Toute la difficulté réside dans le fait de créer un truc suffisamment générique pour traiter le maximum de cas, mais pas trop pour ne pas matcher avec n'importe quoi. Un exemple, la chaîne "les regex c'est top or c'est pas top ça depend des gens", bah elle matche avec toutes les expressions que tu as proposées plus haut , et on est quand même a mille lieues de ce que tu cherches à parser .
Partager