2010-12-14 22 views
5

Tengo que resolver un problema de expresiones regulares que podría ser específico, mirando a través del desbordamiento de pilas. He hecho algunos buenos descubrimientos, pero no he podido unirlos para hacerlo funcionar.Reparando nombres de calles con expresiones regulares

Básicamente quiero esto:

lorem ipsum north road =>lorem ipsum rd (n)

north lorem ipsum rd =>lorem ipsum rd (n)

lorem ipsum road north =>lorem ipsum rd (n)

Como parte de un programa completo de auto que necesito para convertir texto parcial a la versión correcta para que pueda verificar la base de datos

lorem ipsum soUTH rd =>lorem ipsum rd (s)

west lorem ipsum road =>lorem ipsum rd (w)

no quiero a alguien para codificar este programa para mí, pero me gustaría saber la mejor forma de abordar el problema.

Ahora usted me puede preguntar por qué me molesto, ya que la gente no escribir con tal gramática f'd arriba, pero eso es porque yo no sólo estoy tratando con Inglés :(

Saludos

+4

Este es un gran desafío. Anteriormente había creado un RegExp que encontraba tipos de calles (es decir, "Street", "Lane", "Avenue", "Ave", etc.) pero incluso eso era un RegExp de más de 200 caracteres. Para resolver esto sería más complejo que eso. Los casos extremos como "North Rd", "West Ave", etc. lo harían aún más desafiante. –

+1

Creo que este es el tipo de pregunta que no debería resolverse con una sola gran expresión regular. Sería más sencillo dividir la tarea en pequeños pasos y hacerlos por separado: p. compruebe hacia el norte, n ... etc. y agregue un "(n)" al final; verificar las otras direcciones; verifique las abreviaturas de "camino" ... etc. Si haces cada uno en un paso diferente, probablemente será más fácil de seguir y más fácil de escribir. –

+1

Ooh, otro pensamiento: si lo hace paso a paso, tendrá la opción de deshacer su modificación e intentar la búsqueda de nuevo: es posible que alguna calle tenga algo en el nombre real que reemplazó. –

Respuesta

0

Para el primera parte de su pregunta, sería el siguiente seudo mirada expresiones regulares algo así como lo que está después?

(<direction>?) <road name> (<direction>?) <road type> (<direction>?) 

a continuación, comprobar para cada uno de los tres <direction> expresiones regulares opcional, incluyendo cualquier condición que desea darle. tendrá para venir w con el <direction>, <road name> y <road type> regex usted mismo. Esas expresiones regulares probablemente sean específicas, p. (camino) | (rd) | (calle) | (st).

Para la segunda parte de la pregunta (es decir, autocompletar), es posible que necesite indexar algunas o todas las categorías regex mencionadas anteriormente (es decir, direcciones, nombres de carreteras y tipos de carreteras), dependiendo de cuánto desee autocompletar

3

Me parece que lo más difícil es buscar las palabras adecuadas en la ubicación correcta en la línea con expresiones regulares, entonces, aunque no es elegante, ¿podría ser una forma más manejable de hacerlo con la expresión regular mínima? :

  1. extraer todas las palabras conocidas y sus variaciones ( tipos de vías, dirección, números, ...) desde la línea dirección y, con suerte, nos quedaría con el nombre de la carretera.

  2. Componer la línea de dirección hacia atrás, pero en el orden que necesitamos (nombre de la carretera + tipo de carretera + dirección).

Una vez que deshacerse de la posición, las variaciones teóricas Posible siguen siendo grandes, pero las variaciones predecibles no debería ser tan grande, incluso teniendo en cuenta los errores de ortografía:? Avenida: Avenu, Avene, Aveniu, Avns, Av, Avn. Carretera: Rd, Roud, Roade, Roud?

+0

Así es como yo lo haría también. Una expresión regular también dependería del formato para poder realizar el trabajo correctamente, ya que el usuario puede escribir * cualquier cosa *, en * cualquier orden *. Al eliminar todas las palabras conocidas (y combinaciones) y realizar un seguimiento de todos esos cambios, es posible que pueda obtener los resultados adecuados. – Joost

+0

He hecho esto antes en VB6 para una aplicación que creaba etiquetas postales todos los días. Fue un enfoque exitoso, pero definitivamente necesita hacer el trabajo de campo en todas las combinaciones que desea reemplazar. De vez en cuando, me encontraba con problemas con las direcciones locas, por lo que deberías vigilar las cosas y agregar filtros negativos (cadenas para no tocar) para las direcciones alocadas ocasionales que no están en un patrón regular. – zanlok

Cuestiones relacionadas