allegro-C BlueChyp V27.2 |
Neuer- und Verbesserungen 7. Mai 2007 |
Mehr zu den Themen: | Die Volltextsuche mit "Regulären Ausdrücken" Beim Suchen im Text der Datensätze
ist es ja oft so, daß man die genaue Schreibweise nicht kennt. Man sucht z.B.
den Namen Meyer. Hm, vielleicht schreibt er sich aber Meier, Maier, Mayer, oder
es fehlt gar das e vor dem r? Die Methode der sog. Regulären Ausdrücke (engl.
regular expressions, kurz RegEx) erlaubt es dann, das Suchwort
beispielsweise so einzugeben: m[ae][iy]e*r
und dann findet man alle Schreibweisen auf einmal! allegro-Anwender können diese unter Programmierern beliebte Methode ab der V27 anwenden: Auf dem Menü "Finden" gibt es dafür den neuen Punkt "Volltextsuche". Abgelöst wird damit zugleich ein älteres DOS-Hilfsprogramm namens SRCH.EXE. Sowohl der Komfort der neuen Methode wie auch ihr Potential sind weit höher, die Geschwindigkeit der Suche nicht geringer. Auch der bisherige, noch unvollkommene FLEX für die Volltextsuche wird weit übertroffen: der neue ist gut 50fach schneller. Hinweis:
V14-Verweise werden berücksichtigt! Wer also z.B. in der DemoBank nach
"tucholsky" sucht, findet auch Sätze, in denen _tucho steckt. (Beim DOS-Programm
gab es dafür die Option -F.) 0. Man sucht ein ganz normales Wort, sagen wir
"Bücher"
buecher (Also immer Kleinschreibung, Umlaute und ß auflösen, dann wird jede Schreibweise gefunden) Hier sehen Sie schon, daß die Zeichenfolge "buecher" auch als Bestandteil eines längeren Wortes gefunden wird -
falls Sie das nicht erwartet hatten! (Siehe aber unten die Regeln 2 und
3.) 1. Man will mal schauen, ob die exakte
Zeichenfolge "Oesterreich" vorkommt (also mit Oe statt Ö)
_Oesterreich
2. Es wird "Atomphysik" oder "Kernphysik"
gesucht atomphysik / kernphysik (es darf auch beides vorkommen) goethe % shakespeare (nicht beide, aber einer von beiden) 3. "Shakespeare" und "Drama"
sollen auftreten, aber nicht "Hamlet"
shakespeare + drama -
hamlet
(Man kann bis zu 100 Suchwörter verknüpfen, Klammerung ist aber (noch)
nicht möglich.)
<<herzogtum>>
bzw.
#60.*<<herzogtum>>
(<< statt < und >> statt >, weil diese Zeichen sonst
eine Sonderwirkung haben:) SEHR wichtig: Wo man .* angibt, können beliebig viele andere Zeichen stehen. Der Punkt allein besagt, daß an seiner Stelle irgendein
beliebiges Zeichen stehen kann. 5. Im Feld #76 soll eine Jahreszahl größer als 2000
stehen bzw. genau 2000
#76 >2000
bzw. #76
=2000
(Die Zahl braucht dabei nicht am Anfang von #76 zu stehen, z.B. auch in
Klammern) 6. Her mit den alten Sachen über Shakespeare, vor
1920 erschienen!
#3.shakesp + #76
<1920
(Der . sagt: Shakespeare ist in allen Feldern der Gruppe #3 usw. zu suchen, nicht nur in
#31 7. In einem der #81er Felder soll "Diss." vorkommen
(auch "diss." möglich) _#81.*Diss\. / _#81.*diss\.
Hier bedeutet .* "beliebiger Zwischenraum"
und \. findet den Punkt als solchen 8. Im Datensatz soll irgendetwas nicht vorkommen: (s.a. 3.)
-#90 Es soll kein Feld #90 vorhanden sein (auch nicht #90a etc.) #30 - #31 ein #30er-Feld soll vorkommen, #31 (oder #31x) aber nicht (auch #30. - #31. würde gehen, aber ein Maskierungspunkt am Ende ist unnötig) _-#77.*S\. in keinem Feld #77 (also auch #77a etc.) soll die Zeichenfolge "S." auftreten 9. Im Unterfeld $p der Bestellkategorie #9DB soll
ein Preis >20 EUR stehen
_#9DB.*²p>20
(Der _ ist nötig, damit exakt nach #9DB gesucht wird, nicht #9Db oder
#9db) 10. Und was bedeutet m[ae][iy]e*r ? Sicher haben Sie es schon erraten:
Wo [ae] steht, kann entweder ein a oder ein e
stehen, und
e* heißt: hier kann ein e stehen
oder nichts (oder mehrere e) Alle diese Beispiele ergeben sich aus den allgemeinen
Regeln, die nachfolgend aufgelistet sind: Allgemeine Regeln für Reguläre Ausdrücke
Die Punkte 2. und 3. sind
allegro-spezifisch modifiziert, 1. gibt es im gängigen Standard nicht,
15. bis 17. auch nicht! Die Regeln lassen
sich alle sinnvoll miteinander kombinieren. Der gesamte
Ausdruck darf bis zu 1000 Zeichen lang sein. Angewendet wird
ein Suchbefehl stets auf den momentanen Inhalt der "internen Variablen".
Ausgeführt wird
die Suche durch den neuen FLEX-Befehl srx. Der Normalanwender braucht
dies nicht zu wissen, er benutzt einfach die Funktion "Volltextsuche" im Menü
"Finden". Dahinter steckt der FLEX ftr.flx, und darin der Befehl srx. (Für den
Experten gibt es einen FLEX grep.flx, der Textdateien durchsuchen kann, z.B. die
"Verlautbarungen".) 1. Unterstrich an erster Position:
Exaktheit
_abc bzw. abc
Exakte bzw. umcodierte Suche
Setzt man einen _ vor den Suchbegriff, wird dieser exakt gesucht,
d.h. mit Eingabe von _Müll findet man nur
Müll, nicht Muell oder
muell oder müll.
Im Normalfall, also ohne den _, wird der Datentext umcodiert, der
Suchbegriff
selbst aber nicht! Man muß also muell
eingeben, um Müll, Muell und
muell und müll mit einer einzigen Suche zu finden.
Man wird meistens umcodiert suchen wollen, deshalb fordert diese
Variante kein Steuerzeichen. Wichtig: Dann nur Kleinbuchstaben
ohne Akzente eingeben, Umlaute aufgelöst, ss statt
ß!
(Der _ hat nur in der ersten Position diese Wirkung, sonst keine.)
Zur Umcodierung werden die p- oder q-Befehle in den
Indexparametern
verwendet, und zwar diejenigen, die A in a wandeln.
Achtung: _ empfiehlt sich, wenn Sonderzeichen gesucht werden,
die
bei der Umcodierung verschwinden.
Es gibt aber noch weitere Alternativen. Mehr dazu
am Ende: Befehl set xm
Hinweis: SRCH.EXE arbeitete mit einer weniger flexiblen Tabelle
namens s1.asp. 2. Zirkumflex auf erster Position: Feldanfang
^abc findet abc nur, wenn es an
einem Feldanfang steht.
Dabei gilt der Anfang des Feldtextes, ohne die Kategorienummer.
Also: _^Shakesp findet
#40 Shakespeare und #31 Shakespeare.
Wenn aber der zu
durchsuchende Text (der iV-Inhalt) nicht mit '#' beginnt, gilt das erste Zeichen als Textanfang. Bei der grep-Suche in Textdateien ist dies der Zeilenanfang. 3. Dollar an letzter Position: Feldende
abc$ findet abc nur, wenn es am
Ende eines Feldes steht.
Wenn der zu durchsuchende Text (der iV-Inhalt) nicht mit '#'
beginnt, gilt nur das Ende des gesamten iV-Textes. Bei der grep-Suche in Textdateien ist dies das Zeilenende. 4. Punkt ist Joker (engl.
"wildcard")
AB.D findet jedes ABxD, mit beliebigem Zeichen x
Mehrere Punkte innerhalb eines Suchbegriffs möglich, jeder
Punkt
steht dann für genau ein Zeichen. 5. Stern: Keins, eins oder mehrere
ABc*D findet ABD, ABcD, ABccD, ABcccD ... (d.h. c darf auch
ganz fehlen) 6. PunktStern: Binnentrunkierung
(Kombination aus 4 und 5)
AB.*CD findet ABxyzCD mit
beliebiger Folge xyz, aber im selben
Datenfeld, nicht irgendwo weiter hinten im Datensatz!
Das entspricht AB,CD im Programm SRCH
7. Plus: wie Stern, aber mindestens ein
Vorkommnis notwendig
ABx+D findet ABxD, ABxxD, ... (d.h. mind. ein
x muß vorkommen) 8. Eckige Klammern: Variantensuche
AB[pq]Z findet ABpZ und ABqZ
AB[c-f]Z findet ABcZ, ABdZ, ABeZ, ABfZ
Die Angabe [c-f] deutet also an, daß eines der Zeichen
im
Bereich c-f an der Stelle vorkommen muß.
[^c-f] bedeutet Negation, d.h. Zeichen c-f sollen an der Stelle
nicht auftreten
Eine Angabe [c-fp-y] verlangt, daß ein Zeichen aus dem
Bereich
c-f oder p-y vorkommt.
Beispiel: ele[ck]tri findet electri und elektri
9. Kombinationen [...]* und [...]+
*
und + können auch hinter ] auftreten und beziehen sich dann
auf
die in [...] angegebenen Zeichen, d.h.
AB[c-f]*XY findet z.B. ABXY, ABcXY, ABdXY,
ABceXY, ABcdcdfXY, etc
AB[c-f]+XY findet aber ABXY nicht, nur die anderen wie bei
*
i[sz]abel+a findet Isabella, Izabella, Izabela,
Isabela 10. Steuerzeichen finden : Dabei hilft
\
AB\xCD findet ABxCD
Das Zeichen x soll vorkommen. Man setzt \ vor solche Zeichen,
die sonst eine Steuerfunktion haben, also [ ] \ < > +
. * $ ^
sowie auf der allerersten Position die Zeichen _ und
-
Sonderfall: Die Zeichen < bzw. > findet man mit <<
bzw. >>
(wegen 11., 12. und 15.)
Beispiele: mit \. findet man einen echten
Punkt
mit <<dresden>> findet man <Dresden>
(Ordnungshilfe) 11. \< : Wortanfang suchen
\<abc findet abc, aber nur wenn es an einem Wortanfang
steht.
Ein "Wort" beginnt mit Buchstabe oder Ziffer, d.h. es geht
irgendein anderes Zeichen oder kein Zeichen voran, z.B. auch -
12. \> : Wortende suchen
abc\> findet abc, aber nur wenn es an einem Wortende
steht.
Hinter c soll also im Text ein Sonderzeichen oder nichts folgen.
10 und 11 sind kombinierbar, damit ist exakte Wortsuche
möglich. 13. \(...\) : Wiederholung eines Ausdrucks
\(AB\)xyz\1 findet ABxyzAB
\(AB\).*\1 findet AB...AB
mit beliebiger Zeichenfolge zwischen den beiden AB.
Es können weitere Ausdrücke \(...\) auftreten, die danach mit
\2,
\3 etc. im selben Gesamtausdruck wiederholt werden
können. 14. Sonderwerte
Mit \w innerhalb jedes reg.Ausdr. kann man Positionen markieren, an
denen ein Buchstabe vorkommen soll:
\w sucht nach einem beliebigen Buchstaben oder Unterstrich
#90.*[123]\w bedeutet:
Kommt in #90 eine Ziffer 1,2 oder 3 und dann ein Buchstabe vor?
\s sucht nach einem blank (Spatium) Meistens
kann man einfach ein
normales Spatium eingeben! Am Ende des Suchbegriffs aber
nicht,
es würde bei der Zwischenspeicherung in #u!!
verschwinden.
Nützlich, wenn man z.B. die Zeichenfolge " + " sucht!
Dann
also \s+\s verwenden. 15.
Größer/Kleiner/Gleich-Suche
Hiermit wird ein Zahlenvergleich ausgeführt. (Von-Bis-Suche s.
17.)
abc>nnn
findet zuerst abc und vergleicht dann die erste, im selben
Feld
hinter abc folgende Zahl mit nnn. Treffer, wenn
diese
größer als nnn ist.
Wenn abc mehrfach vorkommt, werden alle Vorkommnisse
geprueft!
Beispiel: #77 >100
findet Eintraege, wo in #77 eine Zahl >100 steht
#77 <100
findet Eintraege, wo in #77 eine Zahl <100 steht
#76 =2000
findet Eintraege, wo in #76 die Zahl 2000 steht
Hinweis: Der Zahl dürfen andere Zeichen vorangehen! Der
Vergleich
beginnt bei der ersten Ziffer bzw. Minuszeichen.
Achtung: Würde man hier schreiben: #77>100, dann
würde auch ein
Feld #77a etc. geprüft werden
Tip: _ anwenden, um Probleme mit dem Punkt zu
verhüten, also
eingeben: _#77 >50 statt #77
>50, bes. bei Geldbeträgen!
Beispiel: Preisangaben stehen in #9DB$p. Um alle Bestellsätze
mit
Preis >20 EUR zu finden, kann man geben:
_#9DB.*²p>20
16. Negative Suche
Wenn man ein Minuszeichen an den Anfang eines Ausdrucks
setzt,
und zwar ohne ein Leerzeichen dahinter!,
wird alles gefunden, was NICHT dem Ausdruck
entspricht.
Hinweis: _ muß vor - stehen 17. Logische Kombinationen,
Von-Bis-Suche
Reg. Ausdrücke haben "von Natur aus" keinen Mechanismus
für
boolesche Kombinationsbefehle. Eine Lösung wurde
programmiert.
Damit kann man mehrere nach den Regeln 1-16 gebildete
Ausdrücke
A1, A2 ... logisch miteinander kombinieren, bis zu 100
Stück:
A1 / A2 + A3 - A4 % A5 ...
Die Abarbeitung erfolgt von links nach rechts:
Am Anfang: Status S=0
A1 richtig: S=1
/ A2 : Wenn A2 richtig: S=1
+ A3 : Wenn A3 falsch: S=0
- A4 : Wenn A4 richtig: S=0 und
sogar noch das "exklusive ODER":
Ende: S ist das Ergebnis
Achtung:
Leerzeichen vor und hinter dem Operator! (Anders als beim
DOS-Programm SRCH, wo das nicht klappt.) Sonderfall: Von-Bis-Suche. Diese ist als
Kombination von Größer- und
Nutzung der [..]-Optionen sowie + * . auf manche
Oder-Ausdrücke
verzichten, die sonst nicht ohne Klammerung zu machen
wären! Andere als die hier beschriebenen Sonderzeichen haben keine Sonderwirkung, d.h. sie dürfen in Suchbegriffen vorkommen - vorausgesetzt, sie werden in den Indexparametern nicht ausgefiltert! Dann findet man sie nur mit einem _ am Anfang des Ausdrucks. Und wie ist das alles realisiert? Die Funktion "Volltextsuche" ist nicht fix und fertig fest ins Programm eingebaut - das erscheint nur so! Sondern es wurde eine neue Funktion namens srx in der Makrosprache FLEX geschaffen. Diese Funktion durchsucht den Text, der in der sog. "internen Variablen" steht mithilfe des gewünschten regulären Ausdrucks. Damit konnte ein FLEX namens ftr.flx geschrieben werden, und dieser führt die Volltextsuche in der gesamten Datenbank durch. Es konnte aber auch schon z.B. ein FLEX namens grep.flx geschaffen werden, und der durchsucht Textdateien, ebenfalls mit der RegEx-Technik. Viele weitere Anwendungen sind denkbar, d.h. kundige Anwender können sich eigene, mächtige Suchfunktionen damit erstellen. FLEX-Programmierer können dazu auch auf ein Unterprogramm :ftr zurückgreifen, d.h. dieses in einen eigenen FLEX hineinnehmen! Damit kann eine Volltext-Durchsuchung der Gesamtbank mit ganz wenigen Befehlen in jeden eigenen FLEX eingebaut werden, etwa so:#u!!<regulaerer Ausdruck> perf ftr // Unterprog aufrufen (ist in i-ftr.flx) sho list // Erg.Menge anzeigen end include i-ftr.flx Der Normalanwender kann aber sofort, ohne dieses gesamte Wissen, ohne eine eigene FLEX-Zeile zu schreiben, mit dem Menüpunkt "Volltextsuche" loslegen, und zwar bei jeder Datenbank! Im Grunde ist die normale Suche sehr ähnlich wie beim DOS-Programm. Was dort schon gut war, wurde übernommen, aber verbessert und erweitert. Bis auf die Klammerung, das ist ein noch ungelöstes Problem. Menü: |