Je suis en train d'analyser un langage simple (formules Excel) pour les fonctions qu'il contient. Un nom de fonction doit commencer par n'importe quelle lettre, suivi d'un nombre quelconque de lettres/chiffres, et se terminer par un paren ouvert (pas d'espace entre les deux). Par exemple MyFunc(
. La fonction peut contenir tous les arguments, y compris d'autres fonctions et doit se terminer par un paren )
. Bien sûr, les maths au sein des parens sont autorisés =MyFunc((1+1))
et (1+1)
ne devrait pas être détecté en tant que fonction car il échoue à la règle de fonction que je viens de décrire. Mon but est de reconnaître les appels de fonction de niveau supérieur dans une formule, d'identifier le nom de la fonction, d'extraire les arguments. Avec les arguments, je peux rechercher récursivement d'autres appels de fonction.Regex pour analyser les fonctions avec une profondeur arbitraire
En utilisant ce tutorial j'ai hacké les expressions rationnelles suivantes. Aucun ne semble faire l'affaire. Ils échouent tous les deux sur le cas de test collé ci-dessous.
Ce devrait travail mais complètement échoue:
(?<name>[a-z][a-z0-9]*\()(?<body>(?>[a-z][a-z0-9]*\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!)))\)
Cela fonctionne pour de nombreux cas de test, mais pas pour le cas de test ci-dessous. Je ne pense pas que l'air il gère les fonctions imbriquées juste pour correctement-paren ouvert/paren à proximité de l'imbrication:
(?<name>[a-z][a-z0-9]*\()(?<body>(?>\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!)))\)
Voici le test qui les brise tous:
=Date(Year(A$5),Month(A$5),1)-(Weekday(Date(Year(A$5),Month(A$5),1))-1)+{0;1;2;3;4;5}*7+{1,2,3,4,5,6,7}-1
Cela devrait correspondre comme:
Date(ARGUMENTS1)
Weekday(ARGUMENTS2)
Where ARGUMENTS2 = Date(Year(A$5),Month(A$5),1)
Au contraire, il correspond:
ARGUMENTS2 = Date(Year(A$5),Month(A$5),1)-1)
J'utilise .net RegEx qui fournit de la mémoire externe.
Cela ne peut pas être fait avec une expression régulière comme regex ne fonctionne qu'avec [langues régulières] (http://en.wikipedia.org/wiki/Regular_language). Vous devez utiliser un analyseur. Aussi, est ce devoir? – JoshD
Je pense que cette approche n'a pas beaucoup de sens.Je préférerais écrire un analyseur pour cela. – steinar
@JoshD - pourquoi n'est-ce pas une langue régulière? Quel principe enfreint-il? Je ne peux pas dire. Non, ce n'est pas un devoir (peut-on inverser -1?). Je suis un ingénieur logiciel professionnel et la solution est nécessaire pour contourner un bogue dans Excel. J'ai passé de nombreuses heures à essayer de le faire fonctionner avant de poster. – SFun28