如何从荷兰地址中提取门牌号及附加信息?
荷兰地址门牌号与附加信息拆分实现思路
核心逻辑依据
荷兰地址的门牌号部分始终以数字开头,且位于地址行的最后一段(街道名可能包含数字,比如"18 Septemberplein",但这类数字属于街道名,并非门牌号)。门牌号后的所有内容(包括字母、连字符、空格、额外楼层信息等)均属于附加信息。
分步实现思路
定位门牌号起始位置
- 从地址行的末尾向前逆向扫描,找到第一个连续数字序列的起始点。比如在"Plein 1944 1a 1e etage"中,逆向扫描会跳过"1e"里的1,最终定位到"1a"里的1——这是地址中最后一组独立的数字开头片段,以此确定门牌号的起始位置。
- 核心判断标准:门牌号数字是地址行中最后一组以数字开头的独立片段,需避免将街道名中包含的数字误判为门牌号。
拆分门牌号与附加信息
- 从已定位的起始位置开始,提取连续的数字字符作为门牌号(支持多位数,比如"24"直接提取为门牌号)。
- 数字序列结束后的所有剩余内容(无论是否有空格、连字符、字母或文本),全部作为附加信息保留原格式。例如:
- "2-2" → 门牌号"2",附加信息"-2"
- "1 a 1e etage" → 门牌号"1",附加信息" a 1e etage"
特殊场景处理
- 门牌号与附加信息间有空格:如"1 a 1e etage",数字后的空格及后续内容均计入附加信息
- 附加信息含连字符/空格:如"2 - 2",直接保留"- 2"作为附加信息
- 街道名带数字:确保逆向扫描时只取最后一组数字开头的片段,避免误识别
COBOL适配要点
- 利用COBOL的字符串操作指令(如
INSPECT统计字符类型、UNSTRING拆分片段、子串截取)实现逆向扫描和内容提取。 - 定义对应的数据项存储结果:门牌号可定义为字符型(兼容多位数)或数值型,附加信息定义为足够长度的字符型数据项。
- 逆向扫描可通过循环遍历地址行的字符位置,从最后一位向前检查是否为数字,直到找到第一个非数字字符,再向前确认连续数字的边界。
测试用例验证
- "Notenkrakerstraat 24" → 门牌号=24,附加信息=空
- "Stationsstraat 7a" → 门牌号=7,附加信息="a"
- "Molenweg 3 hs" → 门牌号=3,附加信息="hs"
- "18 Septemberplein 12" → 门牌号=12,附加信息=空
- "Kerkstraat 2-2" → 门牌号=2,附加信息="-2"
- "Hoofdstraat 2 - 2" → 门牌号=2,附加信息="- 2"
- "Plein 1944 1a 1e etage" → 门牌号=1,附加信息="a 1e etage"
- "Plein 1944 1 a 1e etage" → 门牌号=1,附加信息=" a 1e etage"
内容的提问来源于stack exchange,提问作者T-men
相关产品推荐
相关产品推荐

