Zakładając, że mamy tylko jedną linijkę w której jest miejscowość/ulica, nr domu i opcjonalnie numer mieszkania (w tej kolejności) to jeszcze cos możemy ugrać, ale i tak będą przypadki dwuznaczne. Ktoś pewnie napisze lepszy przykład, no ale nie myli się tylko ten, kto nic nie robi. ;)
Mały test:
#!perl
use 5.010;
use strict;
while(<>) {
chomp;
say;
if (/.+(\s\d+\w{0,3})[^\d]+(\d+\w{0,3})/) {
s/(.+)(\s\d+\w{0,3})([^\d]+(\d+\w{0,3}))/ulica: '$1'\nnr domu: $2\nnr mieszkania: $4\n/;
} else {
s/(.+)(\s\d+\w{0,3})/miejscowosc: '$1'\nnr domu: $2\n/;
}
say;
}
$ ./adres.pl adresy
ul. Jana Pawła II 223/m2
ulica: 'ul. Jana Pawła II'
nr domu: 223
nr mieszkania: 2
ul. Jana Pawła 2 223 m. 2
ulica: 'ul. Jana Pawła 2'
nr domu: 223
nr mieszkania: 2
ul. Jana Pawła II 223/2
ulica: 'ul. Jana Pawła II'
nr domu: 223
nr mieszkania: 2
ul. Jana Pawła II 223 / 2
ulica: 'ul. Jana Pawła II'
nr domu: 223
nr mieszkania: 2
al. Alfreda Hiczkoka-Czwartego, 154a/23c
ulica: 'al. Alfreda Hiczkoka-Czwartego,'
nr domu: 154a
nr mieszkania: 23c
os. Agnieszki Osieckiej 22,2
ulica: 'os. Agnieszki Osieckiej'
nr domu: 22
nr mieszkania: 2
ul. Pasiasta 32a mieszkania 5
ulica: 'ul. Pasiasta'
nr domu: 32a
nr mieszkania: 5
Marszałkowo 512
miejscowosc: 'Marszałkowo'
nr domu: 512
Mysia Wólka 15
miejscowosc: 'Mysia Wólka'
nr domu: 15
os. Diabełka 666m.3
ulica: 'os. Diabełka'
nr domu: 666m <<<<< Czy m jest częścią numeru czy już oznacza mieszkanie? (zignorujmy kropkę)
nr mieszkania: 3
os. Diabełka 666aa m. 33aa
ulica: 'os. Diabełka'
nr domu: 666aa
nr mieszkania: 33aa
os. Diabełka 666aa m32ac
ulica: 'os. Diabełka'
nr domu: 666aa
nr mieszkania: 32ac
Jeżeli w jednym stringu mamy cały adres, to nam się troszkę sprawa komplikuje (ale jeżeli znakami nowej linii oddzielone są jego części, to troszke mniej) - tak czy inaczej, jeżeli adres jest potrzebny, a nie od picu, to tak czy siak trzeba go będzie zweryfikować... I zweryfikowany pewnie wklepać ręcznie.
I nowe miejsce pracy gotowe. ;)
edit:
No i już przy "ul. Jana Pawła 2 223" się posypie: "ulica: ul. Jana Pawła, nr domu 2, mieszkania 223. ;)