Ein regulärer Ausdruck ist ein mächtiges Werkzeug, um ein Muster für eine komplexe Suchoperation zu spezifizieren.
MySQL verwendet Henry Spencers Implementierung für reguläre
Ausdrücke, die auf POSIX 1003.2 zugeschnitten ist. Siehe auch
Anhang C, Danksagungen. MySQL benutzt die erweiterte Version, um
Mustererkennung mit dem REGEXP
-Operator in
SQL-Anweisungen zu ermöglichen. Siehe hierzu
Abschnitt 3.3.4.7, „Übereinstimmende Suchmuster“, und
Abschnitt 12.3.1, „String-Vergleichsfunktionen“.
Dieser Anhang fasst mit Beispielen die Sonderzeichen und Konstrukte
zusammen, die in MySQL für REGEXP
-Operationen
eingesetzt werden können. Wir wiederholen hier nicht jedes Detail
von Henry Spencers regex(7)
-Handbuchseite. Diese
Seite ist in den Quelldistributionen von MySQL inbegriffen, nämlich
in der Datei regex.7
unter dem Verzeichnis
regex
.
Ein regulärer Ausdruck beschreibt eine Menge von Strings. Der
einfachste reguläre Ausdruck ist einer ohne Sonderzeichen. So
erkennt beispielsweise der reguläre Ausdruck
hello
nichts anderes als den String
hello
.
Nichttriviale reguläre Ausdrücke verwenden spezielle Konstrukte,
um mehr als nur einen einzigen String erkennen zu können. So passt
beispielsweise der reguläre Ausdruck hello|word
entweder auf den String hello
oder auf den String
word
.
Als komplexeres Beispiel erkennt der reguläre Ausdruck
B[an]*s
die Strings Bananas
,
Baaaaas
, Bs
und und alle
anderen Strings, die mit B
anfangen, mit
s
enden und beliebig viele a
-
oder n
-Zeichen dazwischen aufweisen.
Ein regulärer Ausdruck für den REGEXP
-Operator
kann alle folgenden Sonderzeichen und Konstrukte benutzen:
^
Den Anfang eines Strings erkennen.
mysql>SELECT 'fo\nfo' REGEXP '^fo$';
-> 0 mysql>SELECT 'fofo' REGEXP '^fo';
-> 1
$
Das Ende eines Strings erkennen.
mysql>SELECT 'fo\no' REGEXP '^fo\no$';
-> 1 mysql>SELECT 'fo\no' REGEXP '^fo$';
-> 0
.
Irgendwelche Zeichen erkennen (einschließlich Carriage Return und Newline).
mysql>SELECT 'fofo' REGEXP '^f.*$';
-> 1 mysql>SELECT 'fo\r\nfo' REGEXP '^f.*$';
-> 1
a*
Irgendeine Folge von null oder mehr a
-Zeichen
erkennen.
mysql>SELECT 'Ban' REGEXP '^Ba*n';
-> 1 mysql>SELECT 'Baaan' REGEXP '^Ba*n';
-> 1 mysql>SELECT 'Bn' REGEXP '^Ba*n';
-> 1
a+
Irgendeine Folge von einem oder mehr
a
-Zeichen erkennen.
mysql>SELECT 'Ban' REGEXP '^Ba+n';
-> 1 mysql>SELECT 'Bn' REGEXP '^Ba+n';
-> 0
a?
Null oder ein a
-Zeichen erkennen.
mysql>SELECT 'Bn' REGEXP '^Ba?n';
-> 1 mysql>SELECT 'Ban' REGEXP '^Ba?n';
-> 1 mysql>SELECT 'Baan' REGEXP '^Ba?n';
-> 0
de|abc
Eine der Zeichenfolgen de
oder
abc
erkennen.
mysql>SELECT 'pi' REGEXP 'pi|apa';
-> 1 mysql>SELECT 'axe' REGEXP 'pi|apa';
-> 0 mysql>SELECT 'apa' REGEXP 'pi|apa';
-> 1 mysql>SELECT 'apa' REGEXP '^(pi|apa)$';
-> 1 mysql>SELECT 'pi' REGEXP '^(pi|apa)$';
-> 1 mysql>SELECT 'pix' REGEXP '^(pi|apa)$';
-> 0
(abc)*
Null oder mehr Instanzen der Zeichenfolge abc
erkennen.
mysql>SELECT 'pi' REGEXP '^(pi)*$';
-> 1 mysql>SELECT 'pip' REGEXP '^(pi)*$';
-> 0 mysql>SELECT 'pipi' REGEXP '^(pi)*$';
-> 1
{1}
, {2,3}
Die {n}
- oder
{m,n}
-Notation bietet eine
allgemeingültigere Möglichkeit, reguläre Ausdrücke zu
schreiben, die viele Exemplare des vorangehenden atomaren
Bestandteils (oder „Teils“) des Musters erkennen.
m
und n
sind Integer.
a*
Kann als a{0,}
geschrieben werden.
a+
Kann als a{1,}
geschrieben werden.
a?
Kann als a{0,1}
geschrieben werden.
Genauer gesagt: a{n}
erkennt genau
n
Instanzen von a
.
a{n,}
erkennt n
oder mehr
Instanzen von a
. a{m,n}
erkennt m
bis einschließlich
n
Instanzen von a
.
m
und n
müssen zwischen
0
und RE_DUP_MAX
(Standardwert 255) einschließlich liegen. Sind sowohl
m
als auch n
angegeben,
muss m
kleiner oder gleich
n
sein.
mysql>SELECT 'abcde' REGEXP 'a[bcd]{2}e';
-> 0 mysql>SELECT 'abcde' REGEXP 'a[bcd]{3}e';
-> 1 mysql>SELECT 'abcde' REGEXP 'a[bcd]{1,10}e';
-> 1
[a-dX]
, [^a-dX]
Erkennt jedes Zeichen, das gleich (oder, wenn ^ verwendet wird,
ungleich) a
, b
,
c
, d
oder
X
ist. Ein -
-Zeichen
zwischen zwei anderen Zeichen bildet einen Bereich, der alle
Zeichen vom ersten bis zum zweiten erkennt. So erkennt
beispielsweise [0-9]
jede Ziffer des
Dezimalsystems. Um das Literalzeichen ]
einzubinden, muss dieses unmittelbar hinter der öffnenden
eckigen Klammer [
stehen. Um ein
Literalzeichen -
einzubinden, muss es als
erstes oder letztes Zeichen geschrieben werden. Jedes Zeichen
innerhalb eines Klammerpaars []
, das keine
definierte Sonderbedeutung hat, erkennt nur sich selbst.
mysql>SELECT 'aXbc' REGEXP '[a-dXYZ]';
-> 1 mysql>SELECT 'aXbc' REGEXP '^[a-dXYZ]$';
-> 0 mysql>SELECT 'aXbc' REGEXP '^[a-dXYZ]+$';
-> 1 mysql>SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$';
-> 0 mysql>SELECT 'gheis' REGEXP '^[^a-dXYZ]+$';
-> 1 mysql>SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$';
-> 0
[.characters.]
In einem Ausdruck in eckigen Klammern ([
und
]
) wird hiermit die Zeichenfolge dieses
Kollationselements erkannt. characters
ist
entweder ein einzelnes Zeichen oder ein Zeichenname wie
newline
. Die vollständige Liste der
Zeichennamen finden Sie in der Datei
regexp/cname.h
.
mysql>SELECT '~' REGEXP '[[.~.]]';
-> 1 mysql>SELECT '~' REGEXP '[[.tilde.]]';
-> 1
[=character_class=]
In einem Ausdruck in eckigen Klammern ([
und
]
) stellt
[=character_class=]
eine Äquivalenzklasse
dar. Sie erkennt alle Zeichen mit demselben Kollationswert
einschließlich sich selbst. Wenn beispielsweise
o
und (+)
die Elemente der
Äquivalenzklasse sind, dann sind [[=o=]]
,
[[=(+)=]]
und [o(+)]
alle
synonym. Eine Äquivalenzklasse darf nicht als Endpunkt eines
Bereichs verwendet werden.
[:character_class:]
In einem Ausdruck in eckigen Klammern ([
und
]
) stellt
[:character_class:]
eine Zeichenklasse dar,
die alle zu dieser Klasse gehörigen Zeichen erkennt. Die
folgende Tabelle listet die Standardklassennamen auf. Es sind
die Namen der Zeichenklassen, die auf der Handbuchseite
ctype(3)
definiert sind. Die Klassennamen
können in manchen Spracheinstellungen andere sein. Eine
Zeichenklasse darf nicht als Endpunkt eines Bereichs verwendet
werden.
alnum |
Alphanumerische Zeichen |
alpha |
Alphabetische Zeichen |
blank |
Whitespace-Zeichen |
cntrl |
Steuerzeichen |
digit |
Ziffernzeichen |
graph |
Graphische Zeichen |
lower |
Kleinbuchstaben |
print |
Graphische oder Leerzeichen |
punct |
Interpunktionszeichen |
space |
Leerzeichen, Tabulator, Newline und Carriage Return |
upper |
Großbuchstaben |
xdigit |
Hexadezimalziffern |
mysql>SELECT 'justalnums' REGEXP '[[:alnum:]]+';
-> 1 mysql>SELECT '!!' REGEXP '[[:alnum:]]+';
-> 0
[[:<:]]
, [[:>:]]
Diese Markierungen bedeuten Wortgrenzen. Sie erkennen den Anfang
und das Ende eines Worts. Ein Wort ist eine Folge von
Wortzeichen, denen kein weiteres Wortzeichen voransteht oder
folgt. Ein Wortzeichen ist ein alphanumerisches Zeichen aus der
Klasse alnum
oder ein Unterstrich
(_
).
mysql>SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';
-> 1 mysql>SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';
-> 0
Um ein Sonderzeichen in einem regulären Ausdruck als Literal zu
benutzen, setzen Sie zwei Backslash-Zeichen davor (\). Der Parser
von MySQL interpretiert einen der Backslashes und die Bibliothek
für reguläre Ausdrücke den anderen. Um beispielsweise den String
1+2
zu erkennen, der das Sonderzeichen
+
enthält, ist nur der letzte der folgenden
regulären Ausdrücke der richtige:
mysql>SELECT '1+2' REGEXP '1+2';
-> 0 mysql>SELECT '1+2' REGEXP '1\+2';
-> 0 mysql>SELECT '1+2' REGEXP '1\\+2';
-> 1
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.