Jak znaleźć wzorzec numeru mając numer -problem z algorytmem

0

Cześć, męczę się nad tym już którąś godzinę i nie mogę wykminić.

Sytuacja wygląda tak. Mam serwer MSSQL, i mam tabelę która przechowuje mi pewne wzorce, np:

?55*2
*23?
2*?5
20*

wzorce są tworzone przez użytkownika z użyciem windowsowych symboli wieloznacznych, jakby ktoś nie wiedział:

    • dowolny ciąg
      ? - dowolny znak
      żadnych innych symboli tam nie będzie i zakładamy, że wzorzec jest utworzony tak, że można go jednoznacznie zidentyfikować, tzn. nie będzie sytuacji np: "2?"

I teraz tak.
Mam numer, np: 855034032.
(jak widać, pasuje on do pierwszego wzorca)

Teraz jak mając ten numer, pobrać wzorzec do którego on pasuje?
Mam jeden pomysł, który będzie działał, ale on jest strasznie oporny w implementacji i działaniu, na pewno da się zrobić lepiej. Póki co nie będę o nim pisał, żeby nikomu nic nie sugerować.

0

Zamien to na wzorzec regexpowy i wtedy sprawdz z pomoca jakiejs biblioteki, czy numer pasuje do wzorca.

0

Do tego celu wystarczy moduł "Masks.pas"

uses 
 Masks;

var
 Lista: TStringList;

function CzyNrPasuje(WzorzecNumeru: string): Boolean;
var
 i: Integer;
 VerifMask: TMask;
begin
 Result := False;
 for i := Lista.Count-1 downto 0 do
   begin
    VerifMask := TMask.Create(Lista.Strings[i]);
    Result    := VerifMask.Matches(WzorzecNumeru);
    VerifMask.Free;
    if Result then Break;
   end;
end;

Do zmiennej Lista ładujesz nr telefonów.
Następnie wywołujesz funkcję i sprawdzasz czy wzorzec pasuje do któregoś z nr telefonu(telefonów).

if CzyNrPasuje('???3454?') then ShowMessage('Telefon(y) o podanym wzorcu istnieją');
0

A czemu po prostu nie użyć z języka SQL "like" jako parametr wstawić tu łańcuch z odpowiednimi znakami powtarzania, które akceptuje SQL?

0

dokladnie... popieram poprzednika...

select wzor from wzorce where numer like wzor

0

Po 1. Maski odpadają, bo zarówno numery, jak i wzorce są ustalane przez użytkownika i mogą być różne. Bardzo różne, a z tego, co wiem, to maski służą do określania jakiegoś konkretnego wzorca.
Po 2. Chciałem użyć na początku mechanizmów SQL, jednak problem polega na tym, że numeru nie mam w bazie. W bazie mam tylko wzorce. I tu się pojawia problem, bo mam odnaleźć wzorzec, a nie numer, który mam.

Ostatecznie użyłem do tego wyrażeń regularnych. Jedyny minus jest taki, że muszę porównać numer ze wszystkimi wzorcami aż do odnalezienia dobrego. Jednak tych wzorców nie będzie zbyt wiele, więc myslę, że to może zostać.

0

a po co ci ten numer w bazie? nie mozna normalnego zapytania zbudowac??


create table T_WZORCE_001(
ID_001 integer not null,
WZOR_001 varchar(10);
);

insert into T_WZORCE_001(ID_001, WZOR_001) values(1, '6%7%8');
insert into T_WZORCE_001(ID_001, WZOR_001) values(2, '7%7%7');


select WZOR_001 from T_WZORCE_001 where '666777888' like WZOR_001

--result

WZOR_001
6%7%8


w czym problem?

0

Damn it, nie wpadłem na to.

Wygląda, że działa. Zmieniam, bo to na pewno będzie lepsze rozwiązanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1