Wyszukiwanie z maską w tekscie

0

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].

0

Ja mogę jedynie podać algorytmy wyszukiwania :) Jeżeli chce ci się implementować, to mogę książkę podesłać.

0

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...

0

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.

0

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]

0
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

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