Ein regulärer Ausdruck (regex) ist eine mächtige Möglichkeit, eine komplexe Suche zu formulieren.
MySQL benutzt Henry Spencers Implementation regulärer Ausdrücke, die anstrebt, POSIX-1003.2-konform zu sein. MySQL benutzt die erweiterte Version.
Die vorliegende vereinfachte Referenz überspringt die Details. Um
genauere Informationen zu erhalten, sehen Sie sich Henry Spencers
regex(7)
-Handbuchseite an, die in der
Quelldistribution enthalten ist. See Anhang B, Danksagungen.
Ein regulärer Ausdruck beschreibt einen Satz von Zeichenketten. Der
einfachste regexp ist einer, der keine Sonderzeichen enthält. Der
regexp hello
beispielsweise stimmt mit
hello
und sonst nichts überein.
Nicht triviale reguläre Ausdrücke benutzen bestimmte spezielle
Konstrukte, so dass sie mit mehr als einer Zeichenkette
übereinstimmen können. Der regexp hallo|stefan
beispielsweise stimmt entweder mit der Zeichenkette
hallo
oder der Zeichenkette
stefan
überein.
Um ein komplexeres Beispiel zu geben, stimmt der regexp
B[an]*s
mit jeder der Zeichenketten
Bananas
, Baaaaas
,
Bs
und jeder anderen Zeichenkette überein, die
mit einem B
anfängt, mit einem
s
aufhört und jede beliebige Anzahl von
a
- oder n
-Zeichen dazwischen
enthält.
Ein regulärer Ausdruck kann jedes der folgenden Sonderzeichen bzw. Konstrukte benutzen (0 = keine Übereinstimmung):
^
Stimmt mit dem Anfang einer Zeichenkette überein.
mysql>select "fo\nfo" REGEXP "^fo$"; -> 0
mysql>select "fofo" REGEXP "^fo"; -> 1
$
Stimmt mit dem Ende einer Zeichenkette überein.
mysql>select "fo\no" REGEXP "^fo\no$"; -> 1
mysql>select "fo\no" REGEXP "^fo$"; -> 0
.
Stimmt mit jedem Zeichen überein (inklusive neue Zeile).
mysql>select "fofo" REGEXP "^f.*"; -> 1
mysql>select "fo\nfo" REGEXP "^f.*"; -> 1
a*
Stimmt mit jeder Folge von 0 oder mehr
a
-Zeichen überein.
mysql>select "Ban" REGEXP "^Ba*n"; -> 1
mysql>select "Baaan" REGEXP "^Ba*n"; -> 1
mysql>select "Bn" REGEXP "^Ba*n"; -> 1
a+
Stimmt mit jeder Folge von einem oder mehr
a
-Zeichen überein.
mysql>select "Ban" REGEXP "^Ba+n"; -> 1
mysql>select "Bn" REGEXP "^Ba+n"; -> 0
a?
Stimmt mit 0 oder einem a
-Zeichen überein.
mysql>select "Bn" REGEXP "^Ba?n"; -> 1
mysql>select "Ban" REGEXP "^Ba?n"; -> 1
mysql>select "Baan" REGEXP "^Ba?n"; -> 0
de|abc
Stimmt mit den Zeichenfolgen de
oder
abc
überein.
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)*
Stimmt mit 0 oder mehr Instanzen der Folge
abc
überein.
mysql>select "pi" REGEXP "^(pi)*$"; -> 1
mysql>select "pip" REGEXP "^(pi)*$"; -> 0
mysql>select "pipi" REGEXP "^(pi)*$"; -> 1
{1}
, {2,3}
Es gibt eine allgemeinere Schreibweise für regexps, die mit vielen Vorkommen des vorherigen Atoms übereinstimmen.
a*
Kann als a{0,}
geschrieben werden.
a+
Kann als a{1,}
geschrieben werden.
a?
Kann als a{0,1}
geschrieben werden.
Um genauer zu sein, stimmt ein Atom, gefolgt von einer
Begrenzung, die eine Ganzzahl i
und keine
Kommas enthält, mit einer Folge von genau i
Übereinstimmungen des Atoms überein. Ein Atom gefolgt von
einer Begrenzung, die eine Ganzzahl i
und ein
Komma enthält, stimmt mit einer Folge von i
oder mehr Übereinstimmungen des Atoms überein. Ein Atom,
gefolgt von einer Begrenzung, die zwei Ganzzahlen
i
und j
Übereinstimmungen
enthält, stimmt mit einer Folge von i
bis
j
(inklusive) Übereinstimmungen des Atoms
überein.
Beide Argumente müssen im Bereich von 0
bis
RE_DUP_MAX
(Vorgabe 255) inklusive sein. Wenn
es zwei Argumente gibt, muss das zweite größer oder gleich dem
ersten sein.
[a-dX]
, [^a-dX]
Stimmt mit jedem Zeichen überein, was entweder
a
, b
,
c
, d
oder
X
ist (oder nicht ist, wenn ^ benutzt wird).
Um ein literales ]
-Zeichen einzuschließen,
muss es unmittelbar der öffnenden Klammer [
folgen. Um ein literales -
-Zeichen
einzuschließen, muss es zuerst oder zuletzt geschrieben werden.
Daher stimmt [0-9]
mit jeder Dezimalziffer
überein. Alle Zeichen, die innerhalb eines
[]
-Paars keine definierte Bedeutung haben,
haben keine spezielle Bedeutung und stimmen nur mit sich selbst
überein.
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
[[.zeichen.]]
Die Zeichenfolge des vereinigten Elements. Die Folge ist ein
einzelnes Element der Ausdrucksliste in der Klammer. Ein
Klammerausdruck, der ein Mehrzeichen-Vereinigungselement
enthält, kann daher mit mehr als einem Zeichen übereinstimmen.
Wenn die Vereinigungsfolge zum Beispiel ein
ch
-Vereinigungselement enthält, stimmt der
reguläre Ausdruck [[.ch.]]*c
mit den ersten
fünf Zeichen von chchcc
überein.
[=zeichen_klasse=]
Eine Äquivalenzklasse, die für Zeichenfolgen aller Vereinigungselemente dieser steht, inklusive sich selbst.
Wenn zum Beispiel o
und
(+)
die Mitglieder einer Äquivalenzklasse
sind, sind [[=o=]]
,
[[=(+)=]]
und [o(+)]
allesamt Synonyme. Eine Äquivalenzklasse darf kein Endpunkt
eines Bereichs sein.
[:zeichen_klasse:]
Innerhalb eines Klammerausdrucks steht der Name einer
Zeichenklasse, die in [:
und
:]
eingeschlossen ist, für die Auflistung
aller Zeichen, die zu dieser Klasse gehören.
Standard-Zeichenklassennamen sind:
alnum | digit | punct |
alpha | graph | space |
empty | lower | upper |
cntrl | xdigit |
Diese stehen für die Zeichenklassen, die auf der
ctype(3)
-Handbuchseite definiert sind. Ein
Locale darf andere zur Verfügung stellen. Eine Zeichenklasse
darf nicht als Endpunkt eines Bereichs benutzt werden.
mysql>select "justalnums" REGEXP "[[:alnum:]]+"; -> 1
mysql>select "!!" REGEXP "[[:alnum:]]+"; -> 0
[[:<:]]
, [[:>:]]
Diese stimmen mit der Null-Zeichenkette am Anfang bzw. am Ende
eines Worts überein. Ein Wort ist definiert als Folge von
Wort-Zeichen, dem weder Wortzeichen vorangestellt sind noch
darauf folgen. Ein Wortzeichen ist ein alnum-Zeichen (wie in
ctype(3)
definiert) oder ein Unterstrich
(_
).
mysql>select "a word a" REGEXP "[[:<:]]word[[:>:]]"; -> 1
mysql>select "a xword a" REGEXP "[[:<:]]word[[:>:]]"; -> 0
mysql> select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.