Я бы начал со спины, поскольку, насколько мне известно, название города не может содержать цифр (но оно может содержать пробелы (первый найденный мной пример: « Weil derStadt ”). Затем пятизначным числом перед этим должен быть почтовый индекс.
Число (возможно, сопровождаемое одной буквой) перед этим является номером улицы. Обратите внимание, что это также может быть диапазон . Все, что до этого является названием улицы.
В любом случае, здесь мы идем:
^((?:\p{L}| |\d|\.|-)+?) (\d+(?: ?- ?\d+)? *[a-zA-Z]?) (\d{5}) ((?:\p{L}| |-)+)(?: *\(([^\)]+)\))?$
Это правильно анализирует даже тайные адреса, такие как «Straße des 17».. Juni 23-25 a 12345 Berlin-Mitte ».
Обратите внимание, что это не работает с расширениями адресов (такими как« Gartenhaus »или« c / o… »). Я понятия не имею, как обращаться сЯ сомневаюсь, что есть реальное регулярное выражение, чтобы выразить все это.
Как видите, это довольно сложное регулярное выражение с большим количеством групп захвата. Если , я бы использовалтакое выражение в коде, я бы использовал именованные захваты (Java 7 поддерживает их) и разбивает выражение на более мелкие кусочки, используя флаг x
.К сожалению, Java не поддерживает это.Это s * cks, потому что оно эффективно делает сложные регулярные выражения непригодными для использования.
Тем не менее, вот несколько более разборчивое регулярное выражение:
^
(?<street>(?:\p{L}|\ |\d|\.|-)+?)\
(?<number>\d+(?:\ ?-\ ?\d+)?\ *[a-zA-Z]?)\
(?<zip>\d{5})\
(?<city>(?:\p{L}|\ |-)+)
(?:\ *\((?<suffix>[^\)]+)\))?
$
В Java 7 самое близкое, что мы можем достичь, это (не проверено; может содержать опечатки):
String pattern =
"^" +
"(?<street>(?:\\p{L}| |\\d|\\.|-)+?) " +
"(?<number>\\d+(?: ?- ?\\d+)? *[a-zA-Z]?) " +
"(?<zip>\\d{5}) " +
"(?<city>(?:\\p{L}| |-)+)" +
"(?: *\\((?<suffix>[^\\)]+)\\))?" +
"$";