2008-09-11 19 views
6

Abbiamo uno scenario che ci richiede di analizzare un sacco di e-mail (testo normale), ogni 'tipo' di e-mail è il risultato di uno script eseguito su varie piattaforme. Alcuni sono delimitati da tabulazioni, alcuni sono delimitati da spazi, alcuni semplicemente non lo sappiamo ancora.Qual è il modo migliore per analizzare le stringhe?

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

andiamo per una soluzione che utilizza:

  • Regex
  • Semplicemente stringa di ricerca (utilizzando String.IndexOf ecc)
  • Lex/Yacc
  • Altro

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

risposta

4

Le tre soluzioni che hai specificato coprono esigenze molto diverse.

L'analisi manuale (ricerca testo semplice) è la più flessibile e la più adattabile, tuttavia, molto rapidamente diventa un vero rompicapo 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 a te stesso una maggiore logica dal codice che chiama la regex diversa. Lo svantaggio principale sarebbe la velocità qui.

Lex/Yacc è in realtà solo adattato a sintassi molto complicate e prevedibili e manca un sacco di flessibilità post-compilazione. Non è possibile modificare facilmente il parser a metà analisi, ma in realtà è possibile, ma è troppo pesante e sarebbe meglio usare l'espressione regolare.

So che questo è un cliché risposta, tutto si riduce davvero a ciò che i tuoi bisogni esatti sono, ma da quello che hai detto, io personalmente preferirei andare con un sacchetto di regex.

Come alternativa, come Vaibhav poionted fuori, se si dispone di diverse situazioni che possono sorgere e che si rileva CNA facilmente quale è in arrivo, si potrebbe fare un sistema di plugin che sceglie l'algoritmo giusto, e questi algoritmi potrebbero essere tutti molto diversi, uno con Lex/Yacc in casi a punta e l'altro con IndexOf e regex per casi più semplici.

5

Regex.

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

+1

Ho sentito che il Regex era responsabile per aver abbattuto il muro di Berlino. –

+0

Dovrebbero davvero smettere di usare Nukes nei film di disastri. – Coincoin

+1

Regex: la causa e la soluzione di tutti i problemi della vita. – MatthewKing

0

Regex sarebbe probabilmente bes you bet, provato e provato. Inoltre è possibile compilare un'espressione regolare.

1

Probabilmente si dovrebbe avere un sistema collegabile indipendentemente dal tipo di parsing di stringhe che si usa. Quindi, questo sistema chiama il 'plugin' giusto in base al tipo di email per analizzarlo.

-1

Con il minor numero di informazioni fornite, scegliere Regex.

Ma che tipo di informazioni che si desidera analizzare e ciò che si vorrebbe fare cambierà la decisione di Lex/Yacc forse ..

Ma sembra che hai già fatto la tua mente con lo spago di ricerca :)

0

La tua migliore scommessa è RegEx perché offre un grado di flessibilità molto maggiore rispetto a qualsiasi altra opzione.

Mentre si potrebbe usare per gestire IndexOf quarantina, si possono trovare rapidamente a scrivere codice simile:

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

che possono essere gestiti in un unico prospetto RegEx. Inoltre, ci sono molti posti come RegExLib.com dove puoi trovare persone che hanno condiviso espressioni regolari per risolvere problemi.

1

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

All'interno della configurazione, identificare il tipo di parser che si desidera utilizzare, impostare le opzioni di configurazione e la configurazione per gli identificatori che determinano se un parser agirà o meno. Denominare i parser in base al nome qualificato dell'assemblaggio in modo che i tipi possano essere istanziati in fase di esecuzione anche se non ci sono collegamenti statici ai loro assiemi.

Gli identificatori possono anche implementare un'interfaccia, così puoi creare diversi tipi che controllano cose diverse. Ad esempio, è possibile creare un identificatore di espressioni regolari, che analizza l'e-mail per un modello specifico. Assicurati di mettere tutte le informazioni disponibili sull'identificatore, in modo che possa prendere decisioni su cose come da indirizzi e il contenuto dell'e-mail.

Quando i parser noti non sono in grado di gestire un lavoro, creare una nuova DLL con tipi che implementano le interfacce di parser e identificatore che possono gestire il lavoro e rilasciarli nella directory bin.

1

Dipende da ciò che stai analizzando. Per qualsiasi cosa al di là di ciò che Regex può gestire, ho utilizzato ANTLR. Prima di saltare per la prima volta in discesa ricorsiva, analizzerei come funzionano, prima di provare a utilizzare un framework come questo. Se ti iscrivi a MSDN Magazine, controlla il numero di febbraio 2008 in cui hanno un articolo su come scriverne uno da zero.

Una volta capito, l'apprendimento di ANTLR sarà più facile. Ci sono altri framework là fuori, ma ANTLR sembra avere il maggior supporto della comunità e documentazione pubblica. L'autore ha anche pubblicato The Definitive ANTLR Reference: Building Domain-Specific Languages.

0

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

L'utilizzo di spazi e commenti all'interno della regex può fare molto per rendere più facile il mantenimento delle espressioni regolari. Eric Gunnerson mi ha rivolto questa idea. Ecco an example.

0

Utilizzare PCRE. Tutte le altre risposte sono solo 2 migliori.

+0

Puoi aggiungere un motivo? – Kieron

+0

Ti permette di fare diversi tipi di ricerche Testo, Regex ecc. È una libreria compilata che ti permette di fare tante cose su così tante piattaforme ed è stato testato per anni. Probabilmente sarà molto più veloce dell'implementazione che scriverai. – Geek