Question

Nous avons un scénario qui nous oblige à analyser de nombreux e-mails (texte brut), chaque « type » d'e-mail est le résultat d'un script exécuté sur diverses plates-formes.Certains sont délimités par des tabulations, d'autres par des espaces, d'autres que nous ne connaissons tout simplement pas encore.

Nous devrons également prendre en charge davantage de « formats » à l'avenir.

Allons-nous chercher une solution en utilisant :

  • Expression régulière
  • Recherche simplement par chaîne (en utilisant string.IndexOf, etc.)
  • Lex/Yacc
  • Autre

La solution globale sera développée en C# 2.0 (espérons-le 3.5)

Était-ce utile?

La solution

Les trois solutions que vous avez évoquées couvrent chacune des besoins très différents.

Analyse manuelle (simple recherche de texte) est le plus flexible et le plus adaptable, cependant, cela devient très vite un vrai casse-tête car l'analyse requise est plus compliquée.

Expression régulière sont un juste milieu, et probablement votre meilleur pari ici.Ils sont puissants, mais flexibles, car vous pouvez vous-même ajouter plus de logique à partir du code qui appelle les différentes expressions régulières.Le principal inconvénient serait ici la vitesse.

Lex/Yacc n'est vraiment adapté qu'à des syntaxes très compliquées et prévisibles et manque beaucoup de flexibilité après la compilation.Vous ne pouvez pas facilement changer d'analyseur en cours d'analyse, en fait, vous le pouvez, mais c'est tout simplement trop lourd et vous feriez mieux d'utiliser regex à la place.

Je sais que c'est un cliché répondre, tout dépend vraiment de vos besoins exacts, mais d'après ce que vous avez dit, personnellement, j'irais probablement avec un sac de regex.

En tant que alternative, comme Vaibhav l'a souligné, si plusieurs situations différentes peuvent survenir et que vous pouvez facilement détecter laquelle arrive, vous pouvez créer un système de plugins qui choisit le bon algorithme, et ces algorithmes pourraient tous être très différents, l'un utilisant Lex. /Yacc dans les cas pointus et l'autre utilisant IndexOf et regex pour les cas plus simples.

Autres conseils

Regex.

Regex peut résoudre presque tout, sauf la paix mondiale.Et bien peut-être aussi la paix dans le monde.

Vous devriez probablement disposer d'un système enfichable, quel que soit le type d'analyse de chaîne que vous utilisez.Ainsi, ce système fait appel au bon « plugin » en fonction du type d’email pour l’analyser.

Vous devez concevoir votre solution de manière à ce qu'elle puisse être mise à jour, afin de pouvoir gérer les situations inconnues lorsqu'elles surviennent.Créez une interface pour les analyseurs qui contient non seulement des méthodes pour analyser les e-mails et renvoyer les résultats dans un format standard, mais également pour examiner l'e-mail afin de déterminer si l'analyseur s'exécutera.

Dans votre configuration, identifiez le type d'analyseur que vous souhaitez utiliser, définissez ses options de configuration et la configuration des identifiants qui déterminent si un analyseur agira ou non.Nommez les analyseurs par nom qualifié d’assembly afin que les types puissent être instanciés au moment de l’exécution même s’il n’existe pas de liens statiques vers leurs assemblys.

Les identifiants peuvent également implémenter une interface, vous pouvez donc créer différents types qui vérifient différentes choses.Par exemple, vous pouvez créer un identifiant regex, qui analyse l'e-mail pour un modèle spécifique.Assurez-vous de mettre autant d'informations à la disposition de l'identifiant, afin qu'il puisse prendre des décisions sur des éléments tels que les adresses ainsi que le contenu de l'e-mail.

Lorsque vos analyseurs connus ne peuvent pas gérer une tâche, créez une nouvelle DLL avec des types qui implémentent les interfaces d'analyseur et d'identifiant capables de gérer la tâche et déposez-les dans votre répertoire bin.

Cela dépend de ce que vous analysez.Pour tout ce qui dépasse ce que Regex peut gérer, j'utilise ANTLR.Avant de vous lancer pour la première fois dans l'analyse de descente récursive, je rechercherais comment ils fonctionnent, avant d'essayer d'utiliser un framework comme celui-ci.Si vous êtes abonné à MSDN Magazine, consultez le numéro de février 2008 où il y a un article sur la façon d'en écrire un à partir de zéro.

Une fois que vous aurez compris, apprendre ANTLR sera beaucoup plus facile.Il existe d'autres frameworks, mais ANTLR semble bénéficier du plus grand soutien communautaire et de la documentation publique.L'auteur a également publié La référence ANTLR définitive :Création de langages spécifiques à un domaine.

Regex serait probablement votre meilleur pari, éprouvé et éprouvé.De plus, une expression régulière peut être compilée.

Votre meilleur pari est RegEx car il offre un degré de flexibilité beaucoup plus élevé que toutes les autres options.

Alors que tu pourrais utiliser IndexOf pour gérer quelque chose, vous pouvez rapidement vous retrouver à écrire du code qui ressemble à :

if(s.IndexOf("search1")>-1 || s.IndexOf("search2")>-1 ||...

Cela peut être géré dans une seule instruction RegEx.De plus, il y a beaucoup d'endroits comme RegExLib.com où vous pouvez trouver des personnes qui ont partagé des expressions régulières pour résoudre des problèmes.

@Coincoin a couvert les bases ;Je veux juste ajouter qu'avec les expressions régulières, il est particulièrement facile de se retrouver avec un code difficile à lire et à maintenir.Regex est un langage puissant et très compact, c'est donc souvent ainsi que cela se passe.

L'utilisation d'espaces et de commentaires dans l'expression régulière peut grandement faciliter la maintenance des expressions régulières.Eric Gunnerson m'a fait découvrir cette idée.Voici un exemple.

Utilisez PCRE.Toutes les autres réponses ne sont que la 2e meilleure.

Avec le peu d'informations que vous avez fournies, je choisirais Regex.

Mais le type d'informations que vous souhaitez analyser et ce que vous voudriez faire changera peut-être la décision en Lex/Yacc.

Mais il semble que vous ayez déjà pris votre décision avec la recherche par chaîne :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top