HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Szó keresése szövegben, rövidítési lehetőségekkel


Példaprogram letöltése

11293 bájt

Ebben a cikkben egy olyan kereső függvényt mutatunk be, amely képes egy tetszőleges szövegben megkeresni bármilyen szót úgy, hogy abban használhatjuk a megszokott „*” illetve „?” karaktereket rövidítésre. A megtalált szót, illetve szavakat egy listába gyűjti, és ezt adja vissza eredményül.
A keresett szót tehát a DOS-ban megszokott módon rövidíthetjük. A „*” karakter tetszőleges számú karaktert helyettesít, míg a „?” csak az adott pozícióban lévő karaktert. A „*” és „?” karakterek száma nincs korlátozva, viszont két „*” karakter nem állhat közvetlenül egymás mellett, legalább egy karakternek kell közöttük állnia, ami viszont lehet akár „?” is. További szabály, hogy csak olyan szavakra lehet keresni, amelyek betűt, számot, és „_” karaktert tartalmaznak, tehát például írásjelekre nem.
A megtalált szavak egy listában lesznek felsorolva, melyben megtaláljuk a megtalált szót, annak pozícióját (sor, oszlop, abszolút), valamint a sorszámát.
A lista egy TFindList típusú objektumban lesz eltárolva, amelyet a TList osztályból származtatunk. Ennek elemei egy-egy TFindRec típusú rekordra mutató pointert tartalmaznak. A rekordban a következő mezők találhatók:
  • word: a megtalált szó (pl. „a*” esetén egy „a” betűvel kezdődő szó);
  • pos: a szó pozíciója a szövegben, vagyis hogy hányadik karakterpozícióban található;
  • col: a szó pozíciója a soron belül;
  • row: annak a sornak a száma, amelyben a szó található;
  • count: a szó sorszáma a szövegben (pl. harmadik szónál 3);

Összesen négy függvényt hozunk létre, amelyek külön-külön is meghívhatók. A legfontosabb azonban a FindText, amely közvetve, vagy közvetlenül a többi három függvényt is használja.
function FindText(word, text: string; options: TFindOpts; flist: TFindList): boolean;
Az első paraméter (word) a keresett szó. A második a szöveg, amiben a megadott szót keressük. A harmadik paraméterben megadhatunk két szabályt: az egyik, hogy a keresés csak az első szó megtalálásáig tart (foOnlyFirstWord), a második pedig, hogy a kis- és nagybetűk között tegyen különbséget (foCaseSensitive). Az utolsó paraméterben kapjuk meg a megtalált szavak listáját. Ez egy TFindList típusú objektum, amit nem kötelező megadni (nil). Ebben az esetben csak a függvény visszatérési értékéből tudhatjuk meg, hogy a keresett szó megtalálható-e a szövegben. Ennek a paraméternek egyébként a unit-ban létrehozunk egy globális objektumot (FindList), amit felhasználhatunk, nem kell tehát a függvény meghívása előtt nekünk létrehozni ilyet.
A FindText függvény a text paraméterben megkapott szöveget szavakra bontja, és az aktuális szót a MatchesWord függvénnyel összehasonlítja a keresett szóval:
  if MatchesWord(word, w, foCaseSensitive in options) then ...
A MatchesWord függvény első paramétere a keresett szó, a második pedig szintén egy szó, amivel összehasonlítjuk. A harmadik paraméter egy logikai érték, aminek ha az értéke igaz, akkor a kis- és nagybetűk között különbséget fog tenni. A függvény visszatérési értéke igaz, ha a keresett minta illeszkedik a megadott szóra.
Ebben a függvényben a mintát felbontjuk több részre, a „*” karakterek mentén. A kapott szó részleteket egy TStringList típusú objektumban tároljuk. Ha például az „An*a*e” mintát adtuk meg, akkor három részletet kapunk: „An”, „a” és „e”. Ha a minta „*”-gal kezdődik akkor az első részlet egy üres sztring lesz, ha azzal végződik, akkor pedig az utolsó részlet lesz üres sztring.
Az első ellenőrzés az lesz, hogy az első részletet a szó elejével, a másodikat pedig a szó végével hasonlítjuk össze. Nyilvánvaló, hogy ha valamelyik nem egyezik, akkor a minta nem illeszkedik az adott szóra.
A következőkben ellenőrizzük, hogy az első részletet leszámítva mennyi a közbenső részlet. A fenti példában csak 2 („a” és „e”), de a „*” karakterek számától függően több is lehet („*” karakterek számával egyenlő). Ha nincs közbenső részlet, akkor a minta abban az esetben illeszkedik a szóra, ha a szó és a minta ugyanannyi karakterből áll.
A közbenső részletek ellenőrzése a QPos függvény felhasználásával történik. A QPos paraméterezése teljes egészében megegyezik a MatchesWord függvényével. Ez a függvény a hagyományos Pos függvény szerepét tölti be, tehát egy részletet keres egy sztringben, és ha megtalálta, akkor annak pozíciójával tér vissza. A Pos függvénytől annyiban tér el, hogy figyeli a kis- és nagybetűk közötti különbséget (ha a CaseSensitive paraméter értéke igaz), valamint a „?” karaktert minden más karakterrel egyenlőnek tekinti (mindezek a MatchesChars függvény felhasználása miatt vannak így. Ennek leírása lejjebb olvasható).
A függvény visszatérési értéke a keresett szórészlet pozíciója a szóban. Ha ez a pozíció kisebb, vagy egyenlő, mint az előző részlet utolsó karakterének pozíciója, akkor a minta nem illeszkedik a szóra, illetve természetesen akkor sem, ha a részlet nem található meg a szóban. A szabály tehát az, hogy a részleteknek egymást kell követniük, és nem lehet átfedés közöttük.
A QPos függvény használja a MatchesChars függvényt, ez végzi el a karakterenkénti összehasonlítást. Paraméterezése megegyezik a QPos függvényével.
A MatchesChars függvényben először ellenőrizzük, hogy a paraméterben megadott két szó (az első a minta, a második az összehasonlítandó szó) hossza megegyezik-e, hiszen csak ebben az esetben van értelme a karakterenkénti összehasonlításnak. Ha csak egyetlen eltérő karaktert talál, akkor befejezi az összehasonlítást.



Cikksorozat

#IDKategóriaCikk címeSorozat
1166DelphiOsztály hierarchia lekérdezése1. rész
1180DelphiOsztály hierarchia lekérdezése2. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 554. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |