[MySQL] REGEXP-Funktion

M3Y3R

Well-known member
ID: 336361
L
8 Mai 2006
1.608
60
Hallo,

ich habe mir folgendes Statement gebastelt (war ja nicht schwer):
SELECT * FROM `TableA` WHERE msg REGEXP 'Zeitanbieter'

Nun muss ich innerhalb des REGEXP´s auch nach folgenden Strings suchen können:

REGEXP schaut aber nur nach dem Suchmuster ob dort w, a, r, n, i oder g drin steht und nicht direkt nach dem Ausdruck.

Mit REGEXP muss das gelöst werden, da auch richtige Reguläre Ausdrücke verarbeitet werden sollen.

Wie kann ich das nun so codieren dass er nach dem gesammten Ausdruck ([warning]) sucht?


Danke für eure Hilfe!


MFG
Papenburger
 
Du musst die Klammern vermutlich escapen:
Code:
SELECT *
FROM `TableA`
WHERE msg REGEXP '\[warning\]'
 
Hab ich auch gedacht, das führt aber nicht zum erwünschten Ergebniss.
Hat sonst noch jemand eine Idee?
 
Hm, dann ist irgendwas anderes falsch:
Code:
...

[edit]

Quark, nicht richtig getestet, sorry.

[edit^2]

Es geht, wenn man \\ verwendet:
Code:
[FONT="Courier New"]mysql> SELECT 'this is a [warning] for you to notice' REGEXP '\\[warning\\]';
+----------------------------------------------------------------+
| 'this is a [warning] for you to notice' REGEXP '\\[warning\\]' |
+----------------------------------------------------------------+
|                                                              1 | 
+----------------------------------------------------------------+[/font]
 
Das war zwar hilfreich, jedoch komme ich nun nicht mehr weiter.

Ich teste die Regulären Ausdrücke mit "The Regex Coach".
Dort funktioniert folgender Ausdruck:

Dieser Ausdruck sucht nach:
wort[wort] zahl

Da dieses muster bei fast allen einträgen identisch ist, bietet sich das Pattern an. Wenn ich dieses Pattern nun in MySQL ausführe, erhalte ich eine leere Rückgabe, warum?


MFG
Papenburger
 
schonmal geschaut, was tleilax geschrieben hat? :roll:

Ja hab ich, aber das hier ist nun eine erweiterung ;)
ich habe doch vorher \\[warning\\] gehabt und daraus wird nun sowas...

\w+\\[\w+\\]\s+\d+

Bedeutung:
\w+ => Text
\\[ => [
\\] => ]
\s+ => Leerzeichen
\d+ => Zahl

Das heißt es könnte so aussehen:
\w+\\[warning\\]\s+\d+

Aber anstelle des Warnings kann auch ein anderer Text stehen...
Wenn ich dies aber direkt im PhpMyAdmin ausführe erhalte ich keine Rückgabe.

MFG
Papenburger
 
\w+\\[\w+\\]\s+\d+

Bedeutung:
\w+ => Text
\\[ => [
\\] => ]
\s+ => Leerzeichen
\d+ => Zahl

tja man müsst eben wissen, was MySQL mit dem \w anstellt, das man das nochmal escapen muss, hätte dir eigentlich nach tleilax post klar sein müssen, das wollte ich dir damit sagen. Nur PHP erlaubt es \w statt \\w zu verwenden.

Es müsste also folgendermaßen lauten:
Code:
\\w+\\[\\w+\\]\\s+\\d+
 
tja man müsst eben wissen, was MySQL mit dem \w anstellt, das man das nochmal escapen muss, hätte dir eigentlich nach tleilax post klar sein müssen, das wollte ich dir damit sagen. Nur PHP erlaubt es \w statt \\w zu verwenden.

Es müsste also folgendermaßen lauten:
Code:
\\w+\\[\\w+\\]\\s+\\d+

Okay, aber auch bei der Abfrage erhalte ich 0 Resultate zurück, was definitv nicht sein kann.
Hier mal ein Auszug aus der Spalte msg:
security[success] 538 Benutzerabmeldung: Benutzername:Administrator Domäne: DELL Anmeldekennung: (0x0,0xA411A7) Anmeldetyp:2
security[success] 680 Anmeldversuch von:MICROSOFT_AUTHENTICATION_PACKAGE_V1_0 Anmeldekonto:Administrator Arbeitsstation: DELL Fehlercode:0x0

Nach dem fett makierten teil soll über Reguläre Ausdrücke gesucht werden...

Wie shcon gesagt, funktioniert auch deinen oben geschriebenen Lösungsansatz nicht...
 
MySQL scheint da 'ne etwas RegExp-Syntax zu haben, da nicht mal ein einfaches \\w zu einem Ergebnis führt.

Probier mal folgendes:
Code:
[[:alpha:]]+\\[[[:alpha:]]+\\][[:blank:]]+[[:digit:]]+
 
MySQL scheint da 'ne etwas RegExp-Syntax zu haben, da nicht mal ein einfaches \\w zu einem Ergebnis führt.

Probier mal folgendes:
Code:
[[:alpha:]]+\\[[[:alpha:]]+\\][[:blank:]]+[[:digit:]]+

Der Ausdruck funktioniert. Worin besteht denn nun der unterschied?
Eigentlich sind ja beide Ausdrücke gleich, nur das eine ist im POSIX und das andere halt nicht...
 
Der Ausdruck funktioniert. Worin besteht denn nun der unterschied?
Eigentlich sind ja beide Ausdrücke gleich, nur das eine ist im POSIX und das andere halt nicht...

neija das POSIX und PCRE 2 verschiedenen Schreibweisen (wahrscheinlich auch mit verschiedener Vorgehensweise und Funktionsumfang) sind, und wenn MySQL eben nur eine POSIX-Bibiliothek hat, kann es keine PCRE-RegExps ausführen.
 
Okay, soweit verstanden.
Nun habe ich aber noch eine Frage.

Ich habe diesen Ausdruck in einer anderen Tabelle gespeichert und versuche nun folgende Abfrage:
PHP:
SELECT `logs`.`msg`
FROM `logs` , `logs_blacklist`
WHERE `logs`.`msg` REGEXP '`logs_blacklist`.`message`'

Nun erhalte ich aber keine Rückgabe mehr... :(
Auch wenn ich den Ausdruck änder, passiert nichts...

Ich habe das auch mal mit einem Inner Join probiert:
PHP:
SELECT l.msg FROM logs AS l
INNER JOIN logs_blacklist AS lb ON (l.msg REGEXP 'lb.message')

Aber hier genau das selbe Problem...

Was mache ich falsch?
 
Zuletzt bearbeitet: