Frage

Wir haben ein Szenario, das verlangt von uns, zu analysieren, viele e-mail (plain text), der in jeder e-mail 'type' ist das Ergebnis eines Skripts ausgeführt wird gegen verschiedene Plattformen.Einige sind tab-getrennt, einige sind Leerzeichen getrennt, einige, die wir einfach noch nicht wissen.

Wir müssen die Unterstützung für weitere Formate " in die Zukunft.

Gehen wir für eine Lösung mit:

  • Regex
  • Einfach die string-Suche (verwenden von string.IndexOf etc)
  • Lex/ Yacc
  • Andere

Die Allgemeine Lösung entwickelt werden, die in C# 2.0 (hoffentlich 3.5)

War es hilfreich?

Lösung

Die drei Lösungen, die Sie erwähnt die jeweils für sehr unterschiedliche Bedürfnisse.

Manuelles Parsing (einfache Textsuche) ist die flexibelste und die anpassungsfähig, es jedoch sehr schnell eine echte Nervensäge wird, wenn die Analyse erforderlich ist komplizierter.

Regex sind ein Mittelweg, und wahrscheinlich hier die beste Wahl. Sie sind leistungsstark und dennoch flexibel, wie Sie können sich mehr Logik aus dem Code hinzufügen, die die verschiedenen Regex nennen. Der größte Nachteil hier würde beschleunigen.

Lex / Yacc ist wirklich nur angepasst sehr kompliziert, vorhersehbar Syntaxen und es fehlt eine Menge Post Flexibilität kompilieren. Sie können nicht einfach Parser Mitte Parsing ändern, auch Sie tatsächlich können, aber es ist einfach zu schwer, und Sie würden besser sein regex statt.

Ich weiß, das ein Klischee ist Antwort , es kommt wirklich darauf an, was Ihre genauen Bedürfnisse sind, aber von dem, was Sie gesagt haben, ich persönlich würde wahrscheinlich mit einer Tasche von regex gehen.

Als Alternative , wie Vaibhav poionted aus, wenn Sie mehrere verschiedene Situationen, die entstehen können und dass Sie leicht erkennen, CNA, die man kommt, könnten Sie ein Plugin-System machen, das den richtigen Algorithmus wählt und diese Algorithmen alle sehr unterschiedlich sein können, eine mit Lex / Yacc in spitzen Fällen und die anderen IndexOf und regex für einfachere Fälle verwendet wird.

Andere Tipps

Regex.

Regex kann fast alles lösen, außer für den Weltfrieden. Nun auch vielleicht Frieden in der Welt.

Sie sollten wahrscheinlich eine steckbare System haben, unabhängig davon, welche Art von Zeichenfolge, die Sie verwenden Parsen. Also, das System fordert das Recht ‚Plugin‘ in Abhängigkeit von der Art der E-Mail, es zu analysieren.

Sie müssen Architekten Ihre Lösung aktualisierbar zu sein, so dass man unbekannte Situationen umgehen können, wenn sie auftauchen. Erstellen Sie eine Schnittstelle für Parser, die nicht nur Methoden enthalten, die für die E-Mails Parsen und die Ergebnisse in einem Standardformat zurückkehrt, sondern auch für die Prüfung der E-Mail, um zu bestimmen, ob der Parser ausgeführt wird.

In der Konfiguration, identifizieren die Art der Parser die Sie verwenden möchten, legen Sie die Konfigurationsoptionen und die Konfiguration für die Kennungen, die bestimmen, ob ein Parser handeln wird oder nicht. Nennen Sie die Parser durch Montage qualifizierten Namen so, dass die Typen zur Laufzeit instanziiert werden, selbst wenn es keine statische Links zu ihren Versammlungen.

Identifiers können eine Schnittstelle implementieren als gut, so können Sie verschiedene Typen erstellen, die für verschiedene Dinge überprüfen. Zum Beispiel könnten Sie einen regulären Ausdruck Bezeichner erstellen, die die E-Mail für ein bestimmtes Muster analysiert. Achten Sie darauf, so viele Informationen zur Verfügung, die Kennung zu machen, so dass es Entscheidungen über Dinge wie von Adressen sowie der Inhalt der E-Mail machen.

Wenn Sie Ihren bekannter Parser kann nicht einen Job handhaben, eine neue DLL mit Typen erstellen, die die Parser und Identifikator Schnittstellen implementieren, die den Job behandeln können und sie in Ihrem bin-Verzeichnis löschen.

Es hängt davon ab, was Sie analysieren.Für alles, was über das hinausgeht, was Regex verarbeiten kann, habe ich es verwendet ANTLR.Bevor Sie sich zum ersten Mal mit rekursivem Descent-Parsing befassen, möchte ich erst einmal untersuchen, wie sie funktionieren, bevor ich versuche, ein Framework wie dieses zu verwenden.Wenn Sie das MSDN Magazine abonnieren, schauen Sie sich die Ausgabe vom Februar 2008 an, in der es einen Artikel darüber gibt, wie man ein Magazin von Grund auf neu schreibt.

Sobald Sie das Verständnis erlangt haben, wird das Erlernen von ANTLR viel einfacher sein.Es gibt andere Frameworks, aber ANTLR scheint die meiste Community-Unterstützung und öffentliche Dokumentation zu haben.Der Autor hat auch veröffentlicht Die definitive ANTLR-Referenz:Aufbau domänenspezifischer Sprachen.

Regex wäre wahrscheinlich Sie BES wetten, bewährte. Plus ein regulärer Ausdruck kann kompiliert werden.

Ihre beste Wette ist RegEx, weil es ein viel höheres Maß an Flexibilität als alle anderen Optionen zur Verfügung stellt.

Während Sie IndexOf Somethings zu behandeln verwenden könnte, können Sie schnell feststellen, selbst Code schreiben, der wie folgt aussieht:

  

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

Das kann in einer RegEx-Anweisung behandelt werden. Darüber hinaus gibt es viel Platz wie RegExLib.com , wo man Leute, die geteilt haben reguläre Ausdrücke finden, um Probleme zu lösen.

@Coincoin hat die Grundlagen abgedeckt; Ich möchte nur hinzufügen, dass mit regex ist es besonders einfach, mit schwer zu lesen, um am Ende, schwer zu pflegen Code. Regex ist eine leistungsfähige und sehr kompakte Sprache, so das ist, wie es geht oft.

Mit Leerzeichen und Kommentaren innerhalb der Regex einen langen Weg gehen, um es einfacher zu machen Regexes zu halten. Eric Gunnerson drehte mich auf diese Idee auf. Hier ein Beispiel .

Mit PCRE. Alle anderen Antworten sind nur 2. Beste.

Mit so wenig Informationen, die Sie zur Verfügung gestellt, würde ich Regex wählen.

Aber welche Art von Informationen möchten Sie analysieren und was Sie wollen, um die Entscheidung zu Lex / Yacc vielleicht tun ändern ..

Aber es sieht aus wie Sie bereits Ihren Verstand oben mit String Suche gemacht haben:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top