Domanda

Abbiamo uno scenario che ci richiede di analizzare molte e-mail (testo semplice), ogni "tipo" di e-mail è il risultato di uno script eseguito su varie piattaforme.Alcuni sono delimitati da tabulazioni, altri da spazi, altri semplicemente non lo sappiamo ancora.

Avremo bisogno di supportare più "formati" anche in futuro.

Cerchiamo una soluzione utilizzando:

  • Regex
  • Semplicemente ricerca di stringhe (usando string.IndexOf ecc.)
  • Lex/Yacc
  • Altro

La soluzione complessiva sarà sviluppata in C# 2.0 (si spera 3.5)

È stato utile?

Soluzione

Le tre soluzioni che hai indicato coprono ciascuna esigenze molto diverse.

Analisi manuale (ricerca testuale semplice) è la più flessibile e la più adattabile, tuttavia diventa molto rapidamente una vera seccatura poiché l'analisi richiesta è più complicata.

Regex sono una via di mezzo e probabilmente la soluzione migliore qui.Sono potenti, ma flessibili in quanto puoi aggiungere tu stesso più logica dal codice che chiama le diverse espressioni regolari.Lo svantaggio principale sarebbe la velocità qui.

Lex/Yacc è in realtà adattato solo a sintassi molto complicate e prevedibili e manca di molta flessibilità post-compilazione.Non puoi cambiare facilmente il parser a metà dell'analisi, beh in realtà puoi ma è semplicemente troppo pesante e faresti meglio a usare regex invece.

So che questo è un cliché risposta, tutto si riduce a quali sono le tue esatte esigenze, ma da quello che hai detto, personalmente probabilmente opterei per un pacchetto di regex.

Come un alternativa, come ha sottolineato Vaibhav, se si possono verificare diverse situazioni diverse e si riesce a individuare facilmente quale sta arrivando, è possibile creare un sistema di plug-in che scelga l'algoritmo giusto e tali algoritmi potrebbero essere tutti molto diversi, uno che utilizza Lex /Yacc nei casi specifici e l'altro utilizzando IndexOf e regex per i casi più semplici.

Altri suggerimenti

Regex.

Regex può risolvere quasi tutto tranne la pace nel mondo.Beh, forse anche la pace nel mondo.

Probabilmente dovresti avere un sistema collegabile indipendentemente dal tipo di analisi delle stringhe che usi.Quindi, questo sistema richiede il "plug-in" giusto a seconda del tipo di email per analizzarlo.

È necessario progettare la soluzione in modo che sia aggiornabile, in modo da poter gestire situazioni sconosciute quando si presentano.Creare un'interfaccia per i parser che contenga non solo metodi per analizzare le email e restituire risultati in un formato standard, ma anche per esaminare l'email per determinare se il parser verrà eseguito.

All'interno della configurazione, identifica il tipo di parser che desideri utilizzare, imposta le sue opzioni di configurazione e la configurazione per gli identificatori che determinano se un parser agirà o meno.Denominare i parser in base al nome completo dell'assembly in modo che sia possibile creare un'istanza dei tipi in fase di esecuzione anche se non sono presenti collegamenti statici ai relativi assembly.

Gli identificatori possono anche implementare un'interfaccia, quindi puoi creare diversi tipi che controllano cose diverse.Ad esempio, potresti creare un identificatore regex, che analizza l'e-mail secondo uno schema specifico.Assicurati di rendere disponibili quante più informazioni possibile all'identificatore, in modo che possa prendere decisioni su cose come gli indirizzi e il contenuto dell'e-mail.

Quando i parser conosciuti non sono in grado di gestire un lavoro, crea una nuova DLL con tipi che implementano le interfacce del parser e dell'identificatore in grado di gestire il lavoro e rilasciale nella directory bin.

Dipende da cosa stai analizzando.Per qualsiasi cosa oltre ciò che Regex può gestire, sto usando ANTLR.Prima di passare all'analisi di discesa ricorsiva per la prima volta, cercherei come funzionano, prima di tentare di utilizzare un framework come questo.Se ti abboni a MSDN Magazine, controlla il numero di febbraio 2008 dove c'è un articolo su come scriverne uno da zero.

Una volta capito, imparare ANTLR sarà molto più semplice.Esistono altri framework là fuori, ma ANTLR sembra avere il maggior supporto da parte della comunità e documentazione pubblica.L'autore ha anche pubblicato Il riferimento ANTLR definitivo:Creazione di linguaggi specifici del dominio.

Regex sarebbe probabilmente la soluzione migliore, provata e comprovata.Inoltre è possibile compilare un'espressione regolare.

La soluzione migliore è RegEx perché fornisce un grado di flessibilità molto maggiore rispetto a qualsiasi altra opzione.

Mentre potresti usare IndexOf per gestire qualcosa, potresti ritrovarti rapidamente a scrivere un codice simile a:

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

Questo può essere gestito in un'unica istruzione RegEx.Inoltre, ci sono molti posti simili RegExLib.com dove puoi trovare persone che hanno condiviso espressioni regolari per risolvere problemi.

@Coincoin ha coperto le basi;Voglio solo aggiungere che con le espressioni regolari è particolarmente facile ritrovarsi con un codice difficile da leggere e da mantenere.Regex è un linguaggio potente e molto compatto, quindi spesso va così.

Usare spazi bianchi e commenti all'interno della regex può fare molto per rendere più semplice la manutenzione delle regex.Eric Gunnerson mi ha fatto venire questa idea.Ecco un esempio.

Utilizzare PCRE.Tutte le altre risposte sono solo la seconda migliore.

Con le poche informazioni che hai fornito, sceglierei Regex.

Ma che tipo di informazioni vuoi analizzare e cosa vorresti fare cambierà forse la decisione su Lex/Yacc..

Ma sembra che tu abbia già deciso con la ricerca per stringhe :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top