![]()  | 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ü: ![]() ![]()  |