Die Volltextsuche mit "Regulären Ausdrücken"
Man sucht z.B. den Namen Meyer, aber er könnte
auch Meier, Maier oder Mayer geschrieben sein, das zweite e könnte sogar
fehlen. Die Methode der sog. Regulären Ausdrücke erlaubt es dann, das Suchwort
so einzugeben:
m[ae][iy]e*r
und dann findet man alle Schreibweisen zusammen! Über das Menü "Finden / Volltextsuche" können Sie
sofort mit dem Suchen anfangen (dahinter steckt fulltext.flx).
Aber zuerst ein paar einfache Beispiele zum
Ausprobieren an der DemoBank. In grün sieht man, was
jeweils einzugeben ist. Für die meisten Fälle findet man hier schon ein
passendes Muster, ohne die Regeln
genau zu kennen!
0. Man sucht ein ganz normales Wort, sagen
wir "Tragödie"
tragoedie
(Also immer Kleinschreibung eingeben,
Umlaute und ß auflösen, dann wird jede Schreibweise gefunden)
1. Man will
mal schauen, ob die exakte Zeichenfolge
"Oesterreich" vorkommt (also mit Oe statt Ö)
_Oesterreich (hinter dem _ die genaue gesuchte
Schreibweise!)
2. Es wird "Atomphysik" oder
"Kernphysik" gesucht
atomphysik /
kernphysik (es darf auch beides vorkommen)
atomphysik %
kernphysik (nicht beide, aber eins von beiden)
(Anderes Beispiel, das in DemoBank
instruktiv ist: goethe / shakesp bzw. goethe % shakesp)
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.)
SEHR
wichtig: Vor und hinter +,
- und / immer genau ein Spatium setzen.
4. In welchen
Sätzen kommt "Herzogtum" als Ordnungshilfe vor, im ganzen Satz bzw. im
Feld #60
<<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.
ACHTUNG: In allegro-Daten kann das Zeichen # auch als Textzeichen im
Feldinhalt vorkommen, d.h. es könnte auch mal zufällig "#60" z.B.
innerhalb eines Datenfekds #81 stehen. Wie man sich absichert, wenn man
ausdrücklich z.B. #60 NUR als Feldnummer finden will, steht im Anhang .
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. kann sie auch in Klammern stehen.
Es gibt kein >=, aber >1999 bewirkt dasselbe, was >=2000
bewirken würde!)
6. Her mit den alten Sachen über Shakespeare, vor
1920 erschienen!
#40.shakesp +
#76 <1920
(Der . sagt: Shakespeare ist
auch in #402 usw. zu suchen, nicht nur in #40
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
_#9DH - _#9DH.*²n es soll ein Feld #90a vorkommen, darin aber nicht
das Unterfeld ²n
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)
Achtung: Hier wie unter 8. statt ² den Querstrich / setzen,
falls in den Indexparametern der Befehl q .31 / steht, wie es
in den Standardparametern cat.api der Fall ist.
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 und noch manches mehr
ermöglichen:
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 *
Beispiele: theat[er]+
findet Theater und theatre
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 space (Leerzeichen, blank) 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 auch, wenn man z.B. die
Zeichenfolge " + " sucht! Dann
also \s+\s verwenden (s. 17.).
15. Größer/Kleiner/Gleich-Suche
(Von-Bis-Suche s. 17)
Hiermit werden Zahlen oder Zeichenfolgen
verglichen, je nachdem, was vorliegt
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
Alpha-Vergleich: Wenn hinter >
bzw. < keine Zahl, sondern eine
Buchstabenfolge angegeben wird, findet
ein alphabetischer Vergleich statt.
Beispiel: _#74 >A + #74 <D
findet Einträge, wo #74 mit A,B
oder C beginnt
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 [sonst S unverändert]
+ A3 : Wenn A3 falsch: S=0
- A4 : Wenn A4 richtig: S=0
und sogar noch das "exklusive
ODER":
% A5 : Wenn A5 richtig und S=0, oder A5
falsch und S=1, dann S=1, sonst S=0
...
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
Kleiner-Suche
möglich:
#76 >1989 + #76 <2000 findet die
Erscheinungsjahre 1990 bis 1999
Klammerung geht (noch) nicht!
Allerdings kann man durch geschickte
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.
Hinweis: Grundlage der
Volltextsuche ist der FLEX-Befehl srx . Damit konnte das classico-Programm SRCH.EXE komplett abgelöst
werden durch eine mächtigere und schnellere, aber vor allem flexiblere Lösung.
Denn das Duchsuchen von Text aller Art kann nun in eigene FLEX-Abläufe
eingebaut werden.
Tip: Wer die
Volltextsuche jederzeit im Zugriff haben will, schreibt z.B. diese Zeile in
seinen _start.flx:
flip
3&3: VT-Suche=X ftr
und kann sie dann mit Alt+3 starten.
Zur Umcodierung:
Mit dem Befehl
set x.. kann man die Umcodierung auf
eine andere Parameterdatei legen, mehr dazu in der Beschreibung zum Befehl set x .
Anhang: Gezielte Suche nach
Feldnummern
Die Volltextsuche mit dem FLEX ftr.flx ist ab V32.6 darauf eingerichtet, nach
Feldnummern suchen zu können, auch wenn z.B. Zeichenfolgen wie #60 auch
innerhalb von Feldtexten auftreten können. Grundregel: vor die zu suchende
Feldnummer die Kombination \n setzen; sie steht für "Feldende", d.h.
mit \n#60 wird die
#60 nur gefunden, wenn direkt
davor ein Feldendezeichen (dasjenige des vorangehenden Feldes) steht. Was
sofort die Fragen aufwirft:
a) Wie finde ich #60, wenn es in irgendeinem Feld
intern auftritt?
\n#.*#60
b) Wie finde ich #60, wenn es in einem Feld #81
intern auftritt?
\n#81.*#60
c) Wie stelle ich fest, ob # genau in einem #81
vorkommt (nicht aber in irgendeinem #81x)?
\n#81\s.*#60 (denn \s steht für Spatium)
d) Wie finde ich Sätze, in denen # in keinem
Feldinhalt intern auftritt?
-\n#.*#