2010-12-14 10 views
5

Devo risolvere un problema di regex che potrebbe essere specifico, guardando attraverso l'overflow dello Stack Ho fatto delle buone scoperte, ma non sono riuscito a metterle insieme per farlo funzionare.Correggere i nomi delle strade con regex

Fondamentalmente io voglio questo:

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

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

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

Come parte di un programma completo di auto ho bisogno di convertire il testo parziale alla versione corretta in modo che possa controllare il database

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

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

Non voglio che qualcuno a codificare questo programma per me, ma mi piacerebbe sapere il migliore modo di affrontare il problema.

Ora si potrebbe chiedere a me perché ho fastidio, come la gente non avrebbe scritto con tanta grammatica f'd up, ma questo è perché non sono solo che fare con l'inglese :(

Acclamazioni

+4

Questa è una grande sfida. In precedenza ho creato un RegExp che ha trovato tipi di strade (ad esempio "Street", "Lane", "Avenue", "Ave", ecc.) Ma anche questo era un RegExp di oltre 200 caratteri. Per risolvere questo sarebbe più complesso di quello. Casi di confine come "North Rd", "West Ave", ecc. Lo renderebbero ancora più impegnativo. –

+1

Penso che questo sia il tipo di domanda che non dovrebbe essere risolta con una singola grande regex. Sarebbe più semplice suddividere l'attività in piccoli passi e fare quelli separatamente: ad es. controlla per nord, n ... ecc e aggiungi un "(n)" alla fine; controllare le altre direzioni; controlla le abbreviazioni di "strada" ... ecc. Se fai ognuno in un passo diverso, sarà probabilmente più facile da seguire e più facile da scrivere. –

+1

Ooh, un altro pensiero: se lo fai passo dopo passo, avrai la possibilità di annullare la tua modifica e provare di nuovo la ricerca: è possibile che qualche strada abbia qualcosa nel nome reale che hai sostituito. –

risposta

0

Per la prima parte della sua domanda, sarebbe il seguente pseudo espressione regolare aspetto qualcosa di simile a quello che cercate?

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

Poi si controlla per ciascuna delle tre opzionali <direction> regex, tra cui qualunque condizione si vuole dare. sarà necessario venire su w con il <direction>, <road name> e <road type> regex te stesso. Quelle regex dovrebbero probabilmente essere specifiche, ad es. (Strada) | (rd) | (strada) | (st).

Per la seconda parte della domanda (ad esempio il completamento automatico), potrebbe essere necessario indicizzare alcune o tutte le categorie di espressioni regolari sopra menzionate (ad esempio indicazioni stradali, nomi di strade e tipi di strade), a seconda di quanto si desidera completamento automatico.

3

Mi sembra che il punto più difficile sia cercare le parole corrette nella posizione corretta nella riga con espressioni regolari, quindi, anche se non elegante, questo potrebbe essere un modo più gestibile di eseguirlo con regexp minimo? :

  1. estrarre tutte le parole noti e loro variazioni (tipi di strada, direzione, numeri, ...) dalla linea indirizzo e, hopefuly, ci resterebbe il nome della strada.

  2. Comporre la riga dell'indirizzo, ma in l'ordine che ci serve (nome della strada + tipo di strada + direzione).

Una volta si sbarazzarsi della posizione, le variazioni teoriche posible sono ancora grandi, ma le variazioni prevedibili non dovrebbe essere così grande, anche la contabilità per errori di ortografia:? Avenue: Avenu, Avene, Aveniu, Avn, Av, Avn. Strada: Rd, Roud, Roade, Roud?

+0

Ecco come lo farei anch'io. Una regex sarebbe troppo dipendente dal formato per essere in grado di eseguire correttamente il lavoro, in quanto l'utente può digitare * qualsiasi *, in * qualsiasi * ordine. Rimuovendo tutte le parole conosciute (e le combinazioni) e tenendo traccia di tutte quelle modifiche, potresti essere in grado di ottenere risultati corretti. – Joost

+0

L'ho già fatto in VB6 per un'app che creava etichette postali ogni giorno. È stato un approccio di successo, ma hai sicuramente bisogno di fare il lavoro di gambe su tutte le combinazioni che vuoi sostituire. Ogni tanto, mi imbatto in problemi con indirizzi pazzi, quindi avrai bisogno di tenere d'occhio le cose e aggiungere filtri negativi (stringhe per non toccare) per gli indirizzi pazzi occasionali che non sono in uno schema regolare. – zanlok

Problemi correlati