Proprio fuori strada.
Non servono espressioni regolari, nè training.
Va "trasfusa" l'intelligenza della persona (cioè il programmatore) in un banale riconoscitore.
Il quale lavora su alcune funzioncelle di servizio
- prendistringatesta
- mangiastringatesta
- iscellulare
- isprefisso
- isnumerofisso
- isnumeroucraino
- isdigit
- isspazio
- isseparatore
...
L'elaborazione opera banalmente su ogni carattere della stringa, da sinistra verso destra
812 5539387 73512518769 ???. 3824571620 A 1/757/8271679-8516881
In questo caso si parte con prendistringatesta
la quale è grosso modo fatta così (la scrivo senza provarla)
function prendistringatesta(i_stringa:string;i_separatore:char=' '):string;
var
i:integer;
s:string;
begin
result:='';
if i_stringa='' then exit;
if i_separatore='' then exit;
i:=1;
while (i<=length(i_stringa)) do
begin
if (i_stringa[i]<>i_separatore) then
s:=s+i_stringa[i]
else
break;
inc(i);
end;
result:=s;
end;
Quindi prendi la prima stringa fino al separatore (tipicamente spazio, ma in realtà puoi fare anche dei piccoli set, tipo /.-)
a quel punto vedi quanto è lunga.
E' lunga 3, ed è composta solo da interi? => è un prefisso (o il prefisso di un cellulare)
Quindi la "mangi", e prendi la stringa seguente.
Se esso è tutto interi, allora è un numero di telefono
Di che tipo? Dipende da quanto è lungo, e dal prefisso iniziale => compila i dati
Non è tutto interi? Dentro c'è una stringa (un gatto, nell'esempio).
Decodifica e così via.
man mano che decodifichi "mangia" (stringreplace con '')
Trovi qualcosa fatto così?
1/757/8271679-8516881
Cioè isdigit(i_stringa[1]) and (isbarra(i_stringa[2]) and (isnumeri(i_stringa,3,3)) and isbarra(i_stringa,6) ?
Allora è un "numerone" con tanto di vari prefissi.
Se trovi uno o più meno dentro splitta i vari numeri, uscendo con
1.757.8271679 e 1.757.8516881 o qualsiasi cosa si voglia.
Ovviamente la questione può essere
numeri/numeri/numeri-numeri-numeri-numeri-numeri e così via.
In tal caso ci vorrà un banale riconoscitore che conta i numeri in testa, poi dopo la barra e così via.
un "contanumeri(i_stringa;i_inizio;i_separatore):integer"
In questo modo puoi gestire i numeri internazionali con l'indicazione del paese.
Mettendoci magari anche una verifica per un eventuale "+"
... insomma... così.
Avendo addirittura la persona (le persone) che hanno inserito i dati è ancora più banale, basta mandare una email con
"cheminchiavuoldire 1/757/8271679-8516881" ?
E ti risponderanno...
blablabla
Niente di che, ?????
E' assai più divertente quando bisogna fare il reverse engineering di un centinaio di persone diverse che scrivono ognuno come zzzo gli pare.
Come già accennato il mio top è stato "moglie di tizio"