Sancho: regexp - mehrere Wörter in beliebiger Reihenfolge

Beitrag lesen

Hallo Experten,

Gibt es einen von mir bisher übersehenen Regexp-modifier bzw. -switch mit dem ich nach _mehreren_ Wörtern suchen kann, die in _beliebiger_ Reihenfolge vorkommen können, wobei aber jedes der Wörter wenigstens einmal vorhanden sein muss?

Beispiel:

Text:
  'hans war gestern irgendwie komisch'

gesucht werden:
  'gestern'
  'komisch'
  'hans'

'matchender' (aber sehr umständlicher) regulärer Ausdruck
(und noch ohne Berücksichtigung der Wortgrenzen):

$re = '/(gestern.*komisch.*hans)|(gestern.*hans.*komisch)|(komisch.*gestern.*hans)| (etc.) /'

---

Hintergrund der Frage ist eine MySQL-Tabelle mit _mehreren_ Textfeldern.
Die Suche soll für jeden einzelnen Datensatz genau dann als erfolgreich gelten, wenn der gesuchte reguläre Ausdruck auf alle seine Textfelder _zusammen_ zutrifft.
Dadurch erhöht sich die Verknüpfungsdimension noch zusätzlich; und ich denke mal, dass in so einem Fall eine WHERE-clause der Form:

"WHERE CONCAT_WS(' ', feld1, feld2, feld3) REGEXP '$re'"

die resourcenschonendste Variante ist, denn andernfalls wäre folgendes notwendig:

"WHERE CONCAT_WS(' ', feld1, feld2, feld3) REGEXP '$re1'  [ $re1 = '/(^|\W+)gestern($|\W+)/' ]
   AND CONCAT_WS(' ', feld1, feld2, feld3) REGEXP '$re2'    [ $re2 = '/(^|\W+)komisch($|\W+)/' ]
   AND CONCAT_WS(' ', feld1, feld2, feld3) REGEXP '$re3'"   [ $re3 = '/(^|\W+)hans($|\W+)/' ]

(Also mehrere CONCAT_WS- und REGEXP-Aufrufe. Ohne REGEXP komme ich auch in diesem Fall nicht aus wegen der Wortgrenzen. Ich kann nämlich nicht

"WHERE CONCAT_WS(' ', feld1, feld2, feld3) LIKE '%hans%'
  ..."

verwenden, da ja einerseits nicht 'hans' aus '...hansa...' oder '...hanse...' -
 andereseits aber 'hans' aus
 '... hans ...'
 '... hans,...'
 '... hans!...'
 etc.
 sehr wohl gefunden werden soll.)

---

Ich hoffe mein Problem einigermaßen deutlich beschrieben zu haben...

Also nochmal die Frage: Wie läßt sich ein regulären Ausdruck konstruieren, der auf mehrere Wörter in beliebiger Reihenfolge zutrifft? Geht das nur über die Aneinanderreihung aller möglichen Kombinationen - oder gibt es eine andere Möglichkeit?

Grüße,

Sancho