2008-09-11 22 views
6

Tenemos un escenario que nos obliga a analizar muchos correos electrónicos (texto sin formato), cada correo electrónico 'tipo' es el resultado de un script que se ejecuta en varias plataformas. Algunas están delimitadas por tabuladores, algunas están delimitadas por espacios, otras simplemente no lo sabemos.¿Cuál es la mejor forma de analizar cadenas?

Tendremos que admitir más 'formatos' en el futuro también.

hacemos para una solución usando:

  • Regex
  • Simplemente búsqueda de cadenas (usando String.indexOf etc)
  • Lex/Yacc
  • Otros

El general la solución se desarrollará en C# 2.0 (con suerte 3.5)

Respuesta

4

Las tres soluciones indicadas cubren necesidades muy diferentes.

Manual de análisis (búsqueda de texto simple) es el más flexible y el más adaptable, sin embargo, muy rápidamente se convierte en un verdadero dolor en el culo como el análisis requerido es más complicado.

Regex son un término medio, y probablemente su mejor apuesta aquí. Son potentes, pero flexibles, ya que usted mismo puede agregar más lógica del código que llama a las diferentes expresiones regulares. El principal inconveniente sería la velocidad aquí.

Lex/Yacc realmente sólo se adapta a muy complicados, sintaxis predecibles y carece de una gran cantidad de correos compilar flexibilidad. No se puede cambiar fácilmente el analizador en el análisis medio, bueno, en realidad se puede, pero es demasiado pesado y sería mejor usar regex en su lugar.

Sé que este es un cliché respuesta, realmente todo se reduce a lo que son sus necesidades exactas, pero por lo que ha dicho, personalmente, probablemente iría con una bolsa de expresiones regulares.

Como alternativa, como Vaibhav poionted a cabo, si tiene varias situaciones diferentes que pueden surgir y que detecta CNA fácilmente cuál se acerca, usted podría hacer un sistema de plugins que elige el algoritmo correcto, y los algoritmos todos podrían ser muy diferentes, uno usando Lex/Yacc en casos puntiagudos y el otro usando IndexOf y regex para casos más simples.

5

Regex.

Regex puede resolver casi todo excepto por la paz mundial. Bueno, tal vez la paz mundial también.

+1

Escuché que Regex fue el responsable de encallar el muro de Berlín. –

+0

Deberían dejar de usar armas nucleares en las películas de desastres. – Coincoin

+1

Regex: la causa y la solución de todos los problemas de la vida. – MatthewKing

0

Regex probablemente sea tu mejor apuesta, probado y comprobado. Además se puede compilar una expresión regular.

1

Probablemente debería tener un sistema conectable independientemente del tipo de cadena de análisis que use. Por lo tanto, este sistema recurre al "complemento" correcto según el tipo de correo electrónico para analizarlo.

-1

Con tan poca información que haya proporcionado, elegiría Regex.

Pero, ¿qué tipo de información que desea analizar y lo que quiere hacer va a cambiar la decisión de Lex/Yacc tal vez ..

Pero parece que ya ha hecho su mente para arriba con Cadena de búsqueda :)

0

Su mejor apuesta es RegEx porque proporciona un grado de flexibilidad mucho mayor que cualquiera de las otras opciones.

Mientras que usted podría utilizar IndexOf para manejar tantos, es posible encontrar rápidamente el escribir código que se parece a:

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

que puede ser manejado en una declaración de expresiones regulares. Además, hay un montón de lugares como RegExLib.com donde puedes encontrar gente que ha compartido expresiones regulares para resolver problemas.

1

Debe diseñar su solución para que sea actualizable, de modo que pueda manejar situaciones desconocidas cuando surjan. Cree una interfaz para analizadores que contenga no solo métodos para analizar los correos electrónicos y devolver resultados en un formato estándar, sino también para examinar el correo electrónico para determinar si el analizador se ejecutará.

Dentro de su configuración, identifique el tipo de analizador que desea usar, establezca sus opciones de configuración y la configuración de los identificadores que determinan si un analizador actuará o no. Denomine a los analizadores por nombre calificado del ensamblado para que los tipos puedan crearse instancias en el tiempo de ejecución incluso si no hay enlaces estáticos a sus ensamblajes.

Los identificadores también pueden implementar una interfaz, por lo que puede crear diferentes tipos que verifiquen diferentes cosas. Por ejemplo, puede crear un identificador de expresiones regulares, que analiza el correo electrónico para un patrón específico. Asegúrese de poner tanta información disponible para el identificador, para que pueda tomar decisiones sobre cosas como direcciones y el contenido del correo electrónico.

Cuando sus analizadores conocidos no pueden manejar un trabajo, cree una nueva DLL con tipos que implementen el analizador y las interfaces de identificador que pueden manejar el trabajo y colóquelos en su directorio bin.

1

Depende de lo que está analizando. Para algo más allá de lo que Regex puede manejar, he estado usando ANTLR. Antes de saltar al análisis de descenso recursivo por primera vez, investigaría cómo funcionan, antes de intentar usar un marco como este. Si se suscribe a MSDN Magazine, consulte el número de febrero de 2008 donde tienen un artículo sobre cómo escribir uno desde cero.

Una vez que entiendes, aprender ANTLR será mucho más fácil. Existen otros marcos, pero ANTLR parece tener el mayor respaldo de la comunidad y la documentación pública. El autor también ha publicado The Definitive ANTLR Reference: Building Domain-Specific Languages.

0

@Coincoin ha cubierto las bases; Solo quiero agregar que con regex es particularmente fácil terminar con código difícil de leer y difícil de mantener. Regex es un lenguaje potente y muy compacto, así es como suele suceder.

El uso del espacio en blanco y los comentarios dentro de la expresión regular pueden hacer mucho más fácil el mantenimiento de las expresiones regulares. Eric Gunnerson me dirigió a esta idea. Aquí está an example.

0

Utilice PCRE. Todas las otras respuestas son solo 2nd Best.

+0

¿Puedes agregar un motivo? – Kieron

+0

Te permite hacer diferentes tipos de búsquedas Texto, Regex, etc. Es una biblioteca compilada que te permite hacer muchas cosas en tantas plataformas y ha sido probada durante años. Probablemente será mucho más rápido que la implementación que va a escribir. – Geek

Cuestiones relacionadas