понедельник, 12 января 2009 г.

Regexp для разложения адреса

Это регулярное выражение раскладывает адрес на составляющие: местоположение, улица, дом, копрус, квартира:

(?<streetorlocation>((\d+\-)?[А-Я\.]{2,} (\d+-[йая]{1,2} )?)*)(?<streettype>((площ(адь)?(\.)?)|(улица)|(переулок)|(проспект)|(пр-д)|(б-р)|(пр-т)|(бульвар)|(набережная)|(бул(ьв)?[ \.]?)|(п(ер)?(?:\. | )?(-к)?)|(шоссе)|(ш(\.| )+)|(пл(\.| )+)|(пр(\.| )+)|(наб(\.| )+)|(ул(?:\.)?))) *(?<street2>[А-Я]{2,} )?(?:д\.? ?)?(ДОМ)?(?<home>\d+[а-я]?)([ \\\-/К]+(КО(Р)?(П)?(Р)?\.? ?)?(?<building>\d+)[ \\\-/](кв\.? ?)?(?<flat>(\d+|ОБЩ)))*([ \\\-/](кв\.? ?)?(?<flat>(\d+|ОБЩ)))?|((?<streetorlocation>([0-9\- А-Я\.]*)?[А-Я]{2,}) (?<home>\d+)[ \\\-/]((?<building>\d+)[ -/])?(?<flat>(\d+|ОБЩ)))

Корректно выполняется для строк вида:
УЛ. ГОЛОВАЧЕВА 5-1-77
ГОЛОВАЧЕВА 3-3-149
ГОЛОВАЧЕВА 13-31
ГОЛОВАЧЕВА УЛ. 3-3-85
УЛ.ГОЛОВАЧЕВА Д.5 1 80
УЛ.ГОЛОВАЧЕВА Д.3 КОРП.3 КВ.153
ГОЛОВАЧЕВА УЛИЦА Д.17 106
ГОЛОВАЧЕВА УЛИЦА Д.7 КОР.1 76
ГОЛОВАЧЕВА Ул. 190 ОБЩ
ГОЛОВАЧЕВА Ул. 1 2 30
ШЕСТИДЕСЯТИЛЕТИЯ ОКТЯБРЯ Пр-т 11 ОБЩ
КЕДРОВА Ул. 26/22 76
КРЖИЖАНОВСКОГО Ул. 23 2 44
ЧЕРЕМУШКИНСКАЯ Б. Ул. 18 1 44
ЧЕРЕМУШКИНСКАЯ Б. Ул. 18 1 30
НОВОЧЕРЕМУШКИНСКАЯ Ул. 26 ОБЩ


Не работает для:
ГОЛОВАЧЕВА Д.5-2 34
УЛ.ГОЛОВАЧЕВА Д.7 К.2 12
ГОЛОВАЧЕВА Д.11 86
ГОЛОВАЧЕВА 7 1 28 55
ГОЛОВАЧЕВА-17-155
ГОЛОВАЧЕВА 3 КОР3 КВ0066
ШЕСТИДЕСЯТИЛЕТИЯ ОКТЯБРЯ Пр-т 31/18 2 7


Может, кто-нибудь написал более гибкое выражение и готов поделиться?

P.S. Тестировалось программой RegEx Tester

1 комментарий:

  1. интересная задач.
    но один минус все таки я уже вижу. У тебя ни как не контролируется "жадность звездочки"
    Пока тута пробую, попробуй поставить в своем примере после * знак ?

    ОтветитьУдалить