用于将德语地址拆分为其部分的正则表达式

Chr*_*olb 6 java regex split street-address

晚上好,

我试图通过Java将德国地址字符串的各个部分拆分成它的部分.有没有人知道正则表达式或图书馆这样做?要拆分它,如下所示:

Name der Straße 25a 88489 Teststadt

Name der Straße|25a|88489|Teststadt

要么

Teststr. 3 88489 Beispielort (Großer Kreis)

Teststr.|3|88489|Beispielort (Großer Kreis)

如果系统/正则表达式仍然有效,如果缺少像邮政编码或城市这样的部分,那将是完美的.

有没有我可以存档的正则表达式或库?

编辑:德国地址规则:
街道:字符,数字和空格
房屋号码:数字和任何字符(或空格),直到一系列数字(拉链)(至少在这些例子中)
邮编:5位数
地方或城市:其余也许还有空格,逗号或大括号

F.P*_*F.P 12

我遇到了类似的问题,并稍微调整了这里提供的解决方案,并找到了这个解决方案也可以工作,但(imo)有点简单易懂和扩展:

/^([a-zäöüß\s\d.,-]+?)\s*([\d\s]+(?:\s?[-|+/]\s?\d+)?\s*[a-z]?)?\s*(\d{5})\s*(.+)?$/i
Run Code Online (Sandbox Code Playgroud)

以下是一些示例匹配.

它还可以处理丢失的街道号码,并且可以通过向字符类添加特殊字符来轻松扩展.

[a-zäöüß\s\d,.-]+?                         # Street name (lazy)
[\d\s]+(?:\s?[-|+/]\s?\d+)?\s*[a-z]?)?     # Street number (optional)
Run Code Online (Sandbox Code Playgroud)

在那之后,必须有邮政编码,这是绝对必要的唯一部分,因为它是唯一不变的部分.邮政编码后的所有内容都被视为城市名称.


Kon*_*lph 5

我从后面开始,因为据我所知,城市名称不能包含数字(但它可以包含空格(我发现的第一个例子:" Weil der Stadt ").然后是五位数字必须是邮政编码.

在此之前的数字(可能后跟一个字母)是街道号码.请注意,这也可以是一个范围.之前的任何东西都是街道名称.

无论如何,我们走了:

^((?:\p{L}| |\d|\.|-)+?) (\d+(?: ?- ?\d+)? *[a-zA-Z]?) (\d{5}) ((?:\p{L}| |-)+)(?: *\(([^\)]+)\))?$
Run Code Online (Sandbox Code Playgroud)

这正确地解析了神秘的地址,例如"Straßedes17. 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>[^\)]+)\))?
$
Run Code Online (Sandbox Code Playgroud)

在Java 7中,我们可以实现的最接近的是(未经测试;可能包含拼写错误):

String pattern =
    "^" +
    "(?<street>(?:\\p{L}| |\\d|\\.|-)+?) " +
    "(?<number>\\d+(?: ?- ?\\d+)? *[a-zA-Z]?) " +
    "(?<zip>\\d{5}) " +
    "(?<city>(?:\\p{L}| |-)+)" +
    "(?: *\\((?<suffix>[^\\)]+)\\))?" +
    "$";
Run Code Online (Sandbox Code Playgroud)