2010-12-14 10 views
5

Ich muss ein Regex-Problem zu lösen, die zu bestimmten, durch Stack-Überlauf haben könnte Ich habe ein paar gute Entdeckungen gemacht, aber nicht in der Lage gewesen, sie zusammenzufügen, damit es funktioniert.Fixing Straßennamen mit Regex

Grundsätzlich mag ich dies:

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

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

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

Im Rahmen eines Auto kompletten Programms ich brauche Teil Text zu umwandeln auf die richtige Version, so dass es die Datenbank

überprüfen kann

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

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

Ich will nicht jemand für mich, dieses Programm kodieren, aber ich möchte die am besten wissen, Art und Weise, das Problem anzugehen.

Nun könnte man mich fragen, warum ich die Mühe, da die Menschen nicht mit einer solchen f'd up Grammatik schreiben würde, aber das ist, weil ich nicht nur mit Englisch zu tun bin :(

Prost

+4

Dies ist eine große Herausforderung. Ich habe vorher eine RegExp erstellt, die Straßentypen gefunden hat (zB "Street", "Lane", "Avenue", "Ave", etc.), aber selbst das war eine RegExp von über 200 Zeichen. Das zu lösen wäre komplexer. Randfälle wie "North Rd", "West Ave", etc. würden es noch schwieriger machen. –

+1

Ich denke, das ist die Art von Frage, die nicht mit einem einzigen großen Regex gelöst werden sollte. Es wäre einfacher, die Aufgabe in kleine Schritte aufzuteilen und diese getrennt durchzuführen: z.B. Suche nach Norden, N ... usw. und füge ein "(n)" zum Ende hinzu; Überprüfen Sie die anderen Richtungen; Auf Abkürzungen von "Straße" prüfen ... usw. Wenn Sie jedes in einem anderen Schritt tun, wird es wahrscheinlich einfacher zu folgen und einfacher zu schreiben. –

+1

Ooh, ein anderer Gedanke: Wenn du es Schritt für Schritt machst, hast du die Möglichkeit, deine Modifikation rückgängig zu machen und den Lookup erneut zu versuchen: Es ist möglich, dass irgendeine Straße etwas in dem tatsächlichen Namen hat, den du ersetzt hast. –

Antwort

0

Für die ersten Teil Ihrer Frage würde der folgende Pseudo regex Blick etwas wie, was Sie nach?

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

Dann überprüfen Sie für jede der drei optionalen <direction> regex, einschließlich jeglicher Bedingung Sie es geben wollen. Sie müssen w Mit den <direction>, <road name> und <road type> Regex selbst. Diese Regex sollte wahrscheinlich spezifisch sein, z.B. (Straße) | (rd) | (Straße) | (st).

Für den zweiten Teil der Frage (dh Auto-Vervollständigung) müssen Sie möglicherweise einige oder alle der oben genannten Regex-Kategorien (dh Richtungen, Straßennamen und Straßentypen) indizieren, je nachdem, wie viel Sie möchten automatisch vervollständigen

3

scheint mir das schwierigste Bit ist es, nach den richtigen Wörtern an der richtigen Stelle in der Zeile mit Regexps zu suchen, also, obwohl nicht elegant, könnte dies eine bessere Möglichkeit, es mit minimalen Regexp zu tun? :

  1. Extract alle bekannten Wörter und ihre Variationen (Straßentypen, Richtung, Zahlen, ...) von der Adresszeile und hopefuly, würden wir mit der Straßenname gelassen werden.

  2. Komponieren Sie die Adresszeile zurück, aber in die Reihenfolge, die wir benötigen (Straßenname + Straßentyp + Richtung).

Sobald Sie von der Lage loszuwerden, sind die posible theoretischen Variationen immer noch groß, aber die vorhersehbaren Schwankungen sollten nicht so groß sein, auch die Rechtschreibung Buchhaltung: Avenue: Avenu, Avene, Aveniu, Avn, Av, Avn. Straße: Straße, Roud, Roade, Roud?

+0

So würde ich es auch machen. Eine Regex wäre zu formatabhängig, um den Job korrekt ausführen zu können, da der Benutzer * alles * in * beliebiger * Reihenfolge eingeben kann. Indem Sie alle bekannten Wörter (und Kombinationen) entfernen und all diese Änderungen verfolgen, können Sie möglicherweise korrekte Ergebnisse erzielen. – Joost

+0

Ich habe dies bereits in VB6 für eine App getan, die jeden Tag Adressaufkleber erstellt. Es war ein erfolgreicher Ansatz, aber Sie müssen definitiv die Beinarbeit für alle Kombinationen, die Sie ersetzen möchten. Hin und wieder bekam ich Probleme mit verrückten Adressen, also müssen Sie die Dinge im Auge behalten und negative Filter (Strings, die nicht berührt werden) für die gelegentlichen verrückten Adressen hinzufügen, die nicht in einem regelmäßigen Muster sind. – zanlok