Czy ktoś zna jakiś komponent/funkcje/program który umożliwa wyszukiwanie w tekscie z maską ? [Dla jasności: wyszukiwanie z maską czyli ze znakami *, ? które oznaczają *-dowolny ciąg liter, ?-dowolna litera].
Ja mogę jedynie podać algorytmy wyszukiwania :) Jeżeli chce ci się implementować, to mogę książkę podesłać.
hmm, a nie sądzisz że to zły pomysł? tzn jeżeli user wpisze 1* to zamiast znależć w texcie text 1* znajdzie mu np 1a razem z całą resztą textu...
Jemu chodzi ogólnie o stosowanie tzn. wildcards. Toż oczywiście, że 1* wyszuka mu wszystkie ciagi zaczynające się od 1, ale np. może chcieć wyszukać 1*2?
To jest najzwyklejsze w świecie wyszukiwanie z wykorzystaniem wyrażeń regularnych. Ci, którzy bawią się np. w PHP wiedzą o co chodzi (jest na ten temat art w serwisie).
Takie wyszukiwanie robi się tworząc z wyrażenia regularnego automat skończony (zazwyczaj niedeterministyczny, bo łatwiej, ale jeżeli zależy nam na szybkości wyszukiwania to warto utworzyć DAS).
Opis można znaleźć np. w wielokrotnie przytaczanej przeze mnie książce "Kompilatory: reguły, metody i narzędzia" (Aho, Sethi, Ullman) w części poświęconej analizatorowi leksykalnemu. Troszkę skromniejszy, ale również bardzo przydatny opis jest także w książce "Algoritms" (Sedgwick). Tę książkę akurat mam w postaci elektronicznej.
hmm, a nie sądzisz że to zły pomysł? tzn jeżeli user wpisze 1* to zamiast znależć w texcie text 1* znajdzie mu np 1a razem z całą resztą textu...
Można umożliwic userowi właczanie i wyłączanie wyszukiwania z maską, więc tu akurat nie widzę problemu.
Takie wyszukiwanie robi się tworząc z wyrażenia regularnego automat skończony (zazwyczaj niedeterministyczny, bo łatwiej, ale jeżeli zależy nam na szybkości wyszukiwania to warto utworzyć DAS).
Problem zaczyna sie dopiero tutaj... :-P .
Jeżeli chce ci się implementować, to mogę książkę podesłać.
Byłbym głeboko wdzięczny, bo temat nie jest prosty. [stuk]
function GLOBALNE(tekst,maska :string):boolean;
implementation
function GLOBALNE(tekst,maska :string):boolean;
var licznik_maski, dlugosc_maski, licznik_tekstu, dlugosc_tekstu, n,
dlugosc_reszty :byte;
begin
globalne := true;
if maska = '' then globalne := false;
dlugosc_maski := length(maska);
dlugosc_tekstu := length(tekst);
licznik_tekstu := 1;
for licznik_maski := 1 to dlugosc_maski do
if ((maska[licznik_maski] = tekst[licznik_tekstu])
or (maska[licznik_tekstu] = '?'))
and (((dlugosc_tekstu = licznik_tekstu)
and (dlugosc_maski = licznik_maski))
or ((dlugosc_tekstu > licznik_tekstu)
and (dlugosc_maski > licznik_maski)))
then
inc(licznik_tekstu) {litery się zgadzają lub jest "?"}
else
if (maska[licznik_maski] = '*')
and (licznik_maski = dlugosc_maski) then
begin
globalne := true;
exit
end
else
if maska[licznik_maski] = '*' then {występuje "*"}
begin
dlugosc_reszty := dlugosc_tekstu - licznik_tekstu;
for n := 1 to dlugosc_reszty do
begin
if globalne (copy(tekst,licznik_tekstu + n,255),
copy(maska,licznik_maski + 1,255)) = true
then begin
globalne := true;
exit
end
end;
globalne := false;
exit
end
else
if (((dlugosc_tekstu = licznik_tekstu)
and (dlugosc_maski > licznik_maski))
or ((dlugosc_tekstu > licznik_maski)
and (dlugosc_maski = licznik_maski)))
or (maska[licznik_maski] <> tekst[licznik_tekstu])
then begin globalne := false; exit end
end;
Kiedys znalazlem bo myslalem ze sie przyda ale mi sie nie przydalo... no i jest :-D