Я бы начал с обратной стороны, поскольку, насколько мне известно, название города не может содержать чисел (но может содержать пробелы (первый пример, который я нашел: «Weil der Stadt"). Затем пятизначное число перед ним должно быть почтовым индексом.
Номер (возможно, за которым следует одна буква) перед ним - это номер улицы. Обратите внимание, что это также может быть диапазон. Все, что перед этим, - это название улицы.
В любом случае, поехали:
^((?:\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 не поддерживает это. Это дерьмо, потому что это делает сложные регулярные выражения непригодными для использования.
Тем не менее, вот несколько более разборчивое регулярное выражение:
^
(?<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>[^\\)]+)\\))?" +
"$";
person
Konrad Rudolph
schedule
25.03.2012
|
, но комментарий Оли выше также уместен, поскольку я предполагаю, что немецкие адреса разделены пробелами - person Robbie   schedule 26.03.2012