# REGEXP - Wörter in einem Text finden



## derlippe (3. Februar 2005)

Hallo!
Ich möchte gern mittels REGEXP den Text in einer mysql-Tabelle nach mehreren Worten durchsuchen ... z.B. wort1, wort2, wort3. Sind *alle* diese Worte vorhanden, so soll die Zeile ausgegeben werden.

also: SELECT * FROM `tabelle` WHERE `infotext` REGEXP ...

Hab schon einige Varianten versucht, komme jedoch einfach nicht weiter ...
mit ... *REGEXP '(wort1|wort2|wort3)';*
... liefert mir die Abfrage auch Zeilen einer Tabelle, welche nur *ein* Wort enthalten!

mit ... *REGEXP 'wort1(.*)wort2(.*)wort3';*
... erhalte ich nur Zeilen, in der die Wörter in *dieser* Reihenfolge zu finden sind

mit ... *REGEXP '(wort1(.*)wort2|wort2(.*)wort1)';*
... wird zwar die *Reihenfolge* berücksichtigt und die Zeile auch nur ausgegeben, wenn *alle* Wörter vorhanden sind, die abfrage wird aber bei mehr als 3-4 Wörter schon nicht mehr überschaubar es müssten ja alle Möglichkeiten der Reihenfolge eingegeben werden!

gib es nicht eine einfachere Lösung?

*Hinweis:* die oben angegebenen REGEXP-Ausdrücke sind um einiges verkürzt! Vor und nach diesem Problem kommen eigentlich noch andere Bedingungen! mir geht es aber hauptsächlich um diese Sache.

Vielen Dank schonmal!
tschau derlippe


----------



## teppi (3. Februar 2005)

.. mit dem "+" Operator muss eine Suchkette mindestens einmal vorkommen .. Vielleicht solltest du dir den nochmal anschauen ..

Gruß Stefan


----------



## derlippe (4. Februar 2005)

Also wenn ich den "+" Operator verwende, dann funktioniert das trotzdem nicht.
In Verbindung mit dem '|' (ODER) erhalte ich trotzdem Zeilen, die auch nur *ein* Wort enthalten!
Man müsste da das ODER 'einfach' durch UND ersetzen können, sodass die Reihenfolge der Worte *nicht* berücksichtigt wird. Nur gibt es sowas überhaupt?


----------



## teppi (4. Februar 2005)

na das Oder "entschärft" ja dann auch wieder das + ... Ich bin nun wirklich kein Profi in regulären Ausdrücken aber imho is UND die standardverküpfung der einzelnen Komponenten oder ?

http://www.devmag.net/webprog/regulaere_ausdruecke.htm


----------



## Sven Mintel (4. Februar 2005)

Nimm mehrere *RLIKE*, getrennt durch *AND*(oder auch *LIKE*).

Wenn die Reihenfolge egal sein soll, wirst du an dem *AND* nicht vorbeikommen.


----------



## derlippe (4. Februar 2005)

@teppi
Verwende ich den '+'-Operator bei '(.*)((WORT1)+|(WORT2)+)(.*)', dann liefert mir
die Abfrage das gleiche Ergebnis wie ohne '+', weil ja die ODER-Bedingung schon
bei einer 'wahren Seite' erfüllt ist! Oder meintest du das anders?

Ist schon richtig, dass die einzelnen Komponenten mit UND verknüpft sind.
z.B. bei '(.*)(WORT1)(WORT2)(.*)' erhalte ich auch nur zeilen,
in denen *erst* WORT1 UND *dann* WORT2 vorhanden ist!
Ich meinte das mit dem UND aber so, dass WORT1 UND WORT2 vorhanden sein sollen,
egal in welcher Reihenfolge. Also auch 'WORT2 ... WORT1' gefunden wird und das evtl. bei mehreren Worten.

@Sven
Nu hat's bei mir klick gemacht!
Ich hatte mich zu sehr auf den Ausdruck innerhalb des REGEXP '' konzentriert.
LIKE hilft mir nicht ganz so sehr, weil ich vor und nach meinen Ausdrücken noch andere Bedingungen habe. Aber die Idee mehrere REGEXP mit AND zu verknüpfen ist gut!
Habs folgendermaßen gelöst:

*SELECT * FROM mytable WHERE text REGEXP '(...)wort1(...)' AND text REGEXP '(...)wort2(...)' usw.*

Dann wird der Ausdruck auch bei mehreren Worten nicht ganz so komplex!
Habt vielen Dank!

derlippe


----------

