Pregunta

Tenemos un escenario que nos obliga a analizar gran cantidad de e-mail (texto sin formato), cada e-mail 'tipo' es el resultado de una secuencia de comandos se ejecuta contra las diversas plataformas.Algunos están delimitados por tabuladores, algunos tienen un espacio delimitado, algunos simplemente no sabemos todavía.

Vamos a necesitar más apoyo "formatos" y en el futuro.

Tenemos que ir en busca de una solución utilizando:

  • Regex
  • Simplemente cadena de búsqueda (mediante cadena.IndexOf etc)
  • Lex/ Yacc
  • Otros

La solución general será desarrollado en C# 2.0 (esperemos 3.5)

¿Fue útil?

Solución

Las tres soluciones que dijo cada cubrir necesidades muy diferentes.

Manual de análisis de (texto simple búsqueda) 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 una tierra de en medio, y probablemente su mejor apuesta aquí.Ellos son poderosos, pero flexible como usted puede agregar más lógica desde el código que llame a las diferentes expresiones regulares.El principal inconveniente sería la velocidad aquí.

Lex/Yacc sólo es realmente adaptado para muy complicado, predecible sintaxis y carece de un montón de post compilar flexibilidad.Usted no puede cambiar fácilmente el analizador a mediados de análisis, bueno, en realidad se puede, pero es demasiado pesado y que sería mejor usar regex en su lugar.

Sé que esto es un cliché respuesta, en realidad todo se reduce a lo que sus necesidades son, pero de lo que usted dice, yo personalmente probablemente ir con una bolsa de regex.

Como un alternativa, como Vaibhav poionted, si usted tiene varias de las situaciones que pueden surgir y que la cna puede detectar fácilmente que uno es el que viene, podría hacer un sistema de plugins que elige el algoritmo correcto, y los algoritmos podría ser muy diferente, uno con Lex/Yacc en la punta de los casos y el otro con IndexOf y regex para el más simple de los casos.

Otros consejos

Regex.

Regex puede resolver casi todo, excepto para la paz en el mundo.Bueno, tal vez la paz mundial también.

Usted probablemente debería haber un sistema extensible independientemente de qué tipo de análisis de cadenas de utilizar.Así, este sistema se exhorta a la derecha 'plugin' dependiendo del tipo de correo electrónico para analizarlo.

Usted debe diseñar su solución sea actualizable, por lo que usted puede manejar desconocido de situaciones en las que surgen.Crear una interfaz para los analizadores que no sólo contiene los métodos para el análisis de los correos electrónicos y devolver los resultados en un formato estándar, sino también para examinar el correo electrónico para determinar si el analizador se va a ejecutar.

Dentro de su configuración, identificar el tipo de analizador que usted desea utilizar, configurar sus opciones de configuración, y la configuración de los identificadores de determinar si un parser de actuar o no.Nombre de los analizadores de la asamblea, nombre completo, de modo que los tipos se pueden crear instancias en tiempo de ejecución, incluso si no hay enlaces estáticos de sus asambleas.

Los identificadores pueden implementar una interfaz, así que usted puede crear diferentes tipos de comprobación para diferentes cosas.Por ejemplo, usted puede crear una expresión regular identificador, que analiza el correo electrónico para un patrón específico.Asegúrese de hacer la mayor cantidad de información disponible para el identificador, para que pueda tomar decisiones sobre cosas como de las direcciones, así como el contenido del correo electrónico.

Cuando su conocido analizadores no puede manejar un puesto de trabajo, crear un nuevo archivo DLL con tipos que implementa el analizador y el identificador de interfaces que puede manejar el trabajo y colocarlos en el directorio bin.

Depende de lo que estamos analizando.Para cualquier cosa más allá de lo que Regex puede manejar, he estado usando ANTLR.Antes de saltar a recursiva descenso de análisis para la primera vez, me iba a la investigación de cómo funcionan, antes de intentar usar un framework como este.Si tienes una suscripción a MSDN Magazine, compruebe el Febrero de 2008, donde tienen un artículo sobre la escritura de uno desde cero.

Una vez que usted consiga la comprensión, el aprendizaje de ANTLR será una tonelada más fácil.Hay otros marcos por ahí, pero ANTLR parece tener más apoyo de la comunidad y de la documentación pública.El autor ha publicado también La Definitiva ANTLR de Referencia:Edificio De Dominio De Lenguajes Específicos.

Regex probablemente sería usted bes apuesta, probado y comprobado.Además de una expresión regular puede ser compilado.

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

Mientras que usted podría utilizar IndexOf para manejar tantos años, usted puede encontrar rápidamente escribiendo código que se parece a:

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

Que pueden ser manejados en un RegEx declaración.Además, hay un montón de lugar como RegExLib.com donde se puede encontrar personas que han compartido expresiones regulares para resolver problemas.

@Coincoin ha cubierto las bases;Solo quiero añadir que con regex es muy fácil terminar con difíciles de leer, difícil de mantener el código.Regex es un potente y muy compacto idioma, así que eso es lo que va a menudo.

El uso de los espacios en blanco y comentarios dentro de la expresión regular puede ir un largo camino para hacer que sea más fácil de mantener expresiones regulares.Eric Gunnerson que me convirtió a esta idea.Aquí un ejemplo.

El uso de PCRE.Todas las otras respuestas son sólo 2º Mejor.

Con tan poca información que proporcionan, yo elegiría Regex.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top