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