2010-12-14 14 views
5

Muszę rozwiązać problem z wyrażeniem regularnym, który może być konkretny, przeglądając przepełnienie stosu Dokonałem kilku dobrych odkryć, ale nie udało się ich połączyć, aby działało.Naprawianie nazw ulic za pomocą wyrażeń regularnych

Zasadniczo chcę to:

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

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

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

W ramach auto kompletny program muszę konwertować częściowe tekst do poprawnej wersji, aby mógł sprawdzić bazę danych

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

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

Nie chcę aby ktoś kod tego programu do mnie, ale chciałbym wiedzieć, najlepszy sposób rozwiązania problemu.

Teraz możesz zapytać mnie, dlaczego przeszkadza, jak ludzie nie pisać z taką f'd się gramatyki, ale to dlatego, że nie jestem tylko do czynienia z angielskim :(

Cheers

+4

To jest ogromne wyzwanie. Wcześniej utworzyłem RegExp, który znalazł typy ulic (np. "Ulica", "Lane", "Avenue", "Ave", itp.), Ale nawet to było RegExp z ponad 200 znaków. Rozwiązanie tego byłoby bardziej skomplikowane. Krawędzie takie jak "North Rd", "West Ave" itp. Sprawiają, że jest to jeszcze trudniejsze. –

+1

Myślę, że jest to pytanie, które nie powinno być rozwiązywane za pomocą jednego dużego wyrażenia regularnego. Łatwiej byłoby podzielić zadanie na małe etapy i wykonać je osobno: np. sprawdź północ, n ... itd. i dodaj "(n)" na końcu; sprawdź inne kierunki; sprawdź skróty "drogi" ... itd. Jeśli wykonasz każdą z nich w innym kroku, łatwiej będzie ją wykonać i łatwiej ją zapisać. –

+1

Ooh, kolejna myśl: jeśli zrobisz to krok po kroku, będziesz miał opcję cofnięcia modyfikacji i ponownej próby wyszukiwania: możliwe, że niektóre ulice mają coś w rzeczywistej nazwie, którą zastąpiłeś. –

Odpowiedz

0

uzyskać jak pierwsza część pytania, to następujące pseudo regex wyglądać podobnie jak to, czego po?

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

Następnie należy sprawdzić dla każdego z trzech opcjonalnych <direction> regex, w tym co stan chcesz dać. Musisz wymyślić w Zarówno przy samodzielnym wyodrębnianiu, jak i przy użyciu <direction>, i <road type>. Te regex powinno być prawdopodobnie specyficzne, np. (droga) | (rd) | (ulica) | (st).

W przypadku drugiej części pytania (np. Autouzupełnianie) może być konieczne zindeksowanie niektórych lub wszystkich wymienionych wyżej kategorii wyrażeń regularnych (tj. Wskazówek, nazw dróg i typów dróg), w zależności od tego, ile chcesz autouzupełnienie.

3

Wydaje mi się, że najtrudniejszym zadaniem jest poszukiwanie właściwych słów we właściwym miejscu w linii z wyrażeń regularnych, tak więc, choć nie jest to eleganckie, czy może to być łatwiejszy do wykonania sposób z minimalnym wyrażeniem regularnym? :

  1. wyodrębnić wszystkie znane słowa i ich odmiany (rodzaje dróg, kierunkowe, numery, ...) z linii adresowej , a hopefuly, chcielibyśmy być pozostawiony z nazwą drogi.

  2. Skomponuj linię adresu z powrotem, ale w potrzebna nam kolejność (nazwa drogi + typ drogi + kierunek).

Po pozbyć się położeniu, posible teoretyczne warianty są jeszcze duże, ale przewidywalne zmiany nie powinny być tak duże, nawet stanowiących literówek: aleja AVENU, Avene, Aveniu AVN, Av, Avn. Droga: Rd, Roud, Roade, Roud?

+0

Tak też bym to zrobił. Wyrażenie regularne byłoby zbyt zależne od formatu, aby móc poprawnie wykonać zadanie, ponieważ użytkownik może wpisać * cokolwiek *, w * dowolnej * kolejności. Usuwając wszystkie znane słowa (i kombinacje) i śledząc wszystkie te zmiany, możesz uzyskać odpowiednie wyniki. – Joost

+0

Zrobiłem to wcześniej w VB6 dla aplikacji, która codziennie tworzyła etykiety mailingowe. To było udane podejście, ale zdecydowanie powinieneś wykonać legwork wszystkich kombinacji, które chcesz zastąpić. Od czasu do czasu napotykałem na problemy związane ze zwariowanymi adresami, więc trzeba mieć oko na rzeczy i dodawać filtry negatywne (ciągi znaków, aby nie dotykać) w przypadku sporadycznych zwariowanych adresów, które nie mają regularnego wzorca. – zanlok

Powiązane problemy