Premium

Der Operator REGEXP für reguläre Ausdrücke

Der Operator REGEXP (oder sein Synonym RLIKE) in MySQL wird zum Suchen und Verarbeiten von Stringdaten mit Hilfe von regulären Ausdrücken verwendet.

Der Operator ~ für reguläre Ausdrücke

Die Operatoren ~ und ~* in PostgreSQL werden zum Suchen und Verarbeiten von Stringdaten mit Hilfe von regulären Ausdrücken verwendet.

Reguläre Ausdrücke bieten mächtige Möglichkeiten für komplexe Suchmuster, die sich mit dem LIKE-Operator nur schwer umsetzen lassen.

Wann reguläre Ausdrücke statt LIKE einsetzen?

Der LIKE-Operator eignet sich gut für einfache Suchmuster wie das Finden von Strings, die mit bestimmten Zeichen beginnen oder enden bzw. bestimmte Teilstrings enthalten. Wenn du jedoch eine komplexere und flexiblere Suche brauchst — etwa nach mehreren Bedingungen oder mit Sonderzeichen und Bereichen — werden die Operatoren für reguläre Ausdrücke zu einem unverzichtbaren Werkzeug.

Wichtig ist: LIKE vergleicht den String mit dem gesamten Muster, während ein regulärer Ausdruck nach einer Übereinstimmung innerhalb des Strings sucht. Wenn du explizit den Anfang oder das Ende eines Strings prüfen willst, nutzt du die Sonderzeichen ^ und $.

Syntax regulärer Ausdrücke

MySQL 8.1
... WHERE table_field REGEXP 'pattern';

Wobei pattern der reguläre Ausdruck ist, der das Suchmuster festlegt.

MySQL 8.1
... WHERE table_field ~ 'pattern';   -- mit Berücksichtigung der Groß-/Kleinschreibung
... WHERE table_field ~* 'pattern';  -- ohne Berücksichtigung der Groß-/Kleinschreibung

Wobei pattern der reguläre Ausdruck ist, der das Suchmuster festlegt.

Wichtige Details

  1. Groß-/Kleinschreibung

    Standardmäßig sind reguläre Ausdrücke in MySQL nicht zwischen Groß- und Kleinschreibung unterscheidend. Zum Beispiel findet REGEXP 'abc' sowohl abc als auch Abc und ABC.

  2. Sonderzeichen

    Einige Zeichen haben in regulären Ausdrücken eine besondere Bedeutung und müssen escaped werden (zum Beispiel ., *, +, ?, [, ], (, ), {, }, |, \).

    Zum Escapen solcher Zeichen verwendest du einen doppelten Backslash — \\.

  1. Groß-/Kleinschreibung

    Standardmäßig unterscheiden reguläre Ausdrücke in PostgreSQL zwischen Groß- und Kleinschreibung.

    • Operator ~ — mit Berücksichtigung der Groß-/Kleinschreibung
    • Operator ~* — ohne Berücksichtigung der Groß-/Kleinschreibung
  2. Sonderzeichen

    Einige Zeichen haben in regulären Ausdrücken eine besondere Bedeutung und müssen escaped werden (zum Beispiel ., *, +, ?, [, ], (, ), {, }, |, \).

    Zum Escapen solcher Zeichen verwendest du einen einfachen Backslash — \.

Sonderzeichen und Konstrukte

Zeichen und KonstrukteWofür sie stehen
*0 oder mehr Vorkommen des vorangehenden Musters
+1 oder mehr Vorkommen des vorangehenden Musters
.Ein beliebiges einzelnes Zeichen
?0 oder 1 Vorkommen des vorangehenden Musters
^Anfang des Strings
$Ende des Strings
[abc]Ein beliebiges Zeichen aus den eckigen Klammern
[^abc]Ein beliebiges Zeichen, das nicht in den eckigen Klammern steht
[A-Z]Ein beliebiger Großbuchstabe
[a-z]Ein beliebiger Kleinbuchstabe
[0-9]Eine beliebige Ziffer
p1|p2|p3Eines der Muster p1, p2 oder p3
{n}Genau n Vorkommen des vorangehenden Musters
{m,n}m bis n Vorkommen des vorangehenden Musters

Beispiele mit Erklärung

  • Hole alle Nutzer, deren Namen mit „John“ beginnen:

    MySQL 8.1
    SELECT * FROM Users WHERE name REGEXP '^John'
    
    MySQL 8.1
    SELECT * FROM Users WHERE name ~ '^John'
    
    idnameemailemail_verified_atpasswordphone_number
    18John Travoltawainwrig@msn.com2016-11-19T12:30:43.000Zfzjhl0v82o0amalr8649+1 202 555 0176
    28Johnny Deppcgarcia@yahoo.ca2017-05-26T01:19:06.000Zqpp6hbnae42cdhmxlk4j+7 401 195 7363

    Dieser Ausdruck sucht Strings, die mit „John“ beginnen. Das Zeichen ^ markiert den Anfang des Strings.

  • Gib alle Schulfächer aus, deren Name auf „e“ oder „y“ endet:

    MySQL 8.1
    SELECT * FROM  Subject WHERE name REGEXP '[ey]$'
    
    MySQL 8.1
    SELECT * FROM  Subject WHERE name ~ '[ey]$'
    
    idname
    2Russian language
    3Literature
    5Chemistry
    6Geography
    7History
    8Biology
    9English language
    11Physical Culture
    13Technology

    In diesem Beispiel legt [ey] die möglichen Werte für das Muster fest, und $ gibt an, womit der String enden muss.

  • Finde alle Nutzer, deren E-Mail-Adresse auf „@outlook.com“ oder „@icloud.com“ endet:

    MySQL 8.1
    SELECT * FROM Users WHERE email REGEXP '@(outlook\\.com|icloud\\.com)$'
    
    MySQL 8.1
    SELECT * FROM Users WHERE email ~ '@(outlook\.com|icloud\.com)$'
    
    idnameemailemail_verified_atpasswordphone_number
    7Samuel L. Jacksonmoonlapse@outlook.com2018-07-19T11:16:13.000Zi6yvht95527z3idgqx9y+1 202 555 0162
    13Steve Martinnelson@outlook.com2016-07-29T04:25:00.000Zw76yphg3kvzg77ilmxfs+1 202 555 0138
    29Pierce Brosnantreeves@icloud.com2019-03-08T01:56:00.000Zlqiwecclne9rv8woo2go+7 401 749 3620
    30Sean Conneryjschauma@icloud.com2016-05-21T00:45:17.000Zlyh4jkdxkvtvulvqi5db+7 401 511 6783
    31Bruce Williskewley@icloud.com2016-12-08T20:18:59.000Z0ofa2khvnptiackbssv0+375 154 771 3462

    Auch hier markiert $ das Ende des Strings, und | erlaubt mehrere Alternativen.

  • Finde alle Nutzer, deren Telefonnummer keine Ziffern „2“ und „8“ enthält:

    MySQL 8.1
    SELECT * FROM Users WHERE phone_number REGEXP '^[^28]*$'
    
    MySQL 8.1
    SELECT * FROM Users WHERE phone_number ~ '^[^28]*$'
    
    idnameemailemail_verified_atpasswordphone_number
    27Brad Pittkewley@optonline.net2017-02-11T05:45:15.000Z829j2ygocn8btzae49kv+7 401 741 3797
    28Johnny Deppcgarcia@yahoo.ca2017-05-26T01:19:06.000Zqpp6hbnae42cdhmxlk4j+7 401 195 7363

    In diesem Beispiel steht [^28] für jedes Zeichen außer „2“ und „8“, und * erlaubt eine beliebige Anzahl solcher Zeichen. Die Zeichen ^ und $ markieren Anfang und Ende des Strings und sorgen dafür, dass der gesamte String dem Muster entspricht.

  • Finde alle Nutzer, deren Telefonnummer mit „+7“ beginnt

    MySQL 8.1
    SELECT name, phone_number FROM Users WHERE phone_number REGEXP '^\\+7'
    
    MySQL 8.1
    SELECT name, phone_number FROM Users WHERE phone_number ~ '^\+7'
    
    namephone_number
    Hideo Kojima+7 401 452 0052
    ClINT Eastwood+7 401 722 0912
    Brad Pitt+7 401 741 3797
    Johnny Depp+7 401 195 7363
    Pierce Brosnan+7 401 749 3620
    Sean Connery+7 401 511 6783

    In diesem Beispiel markiert ^ den Anfang des Strings. Wir suchen also Strings, die mit einem bestimmten Muster beginnen.

    Da + in regulären Ausdrücken ein Sonderzeichen ist, muss es mit einem doppelten Backslash (\\) escaped werden, damit es als gewöhnliches + interpretiert wird. So entspricht \\+ dem Zeichen + im String.

    Da + in regulären Ausdrücken ein Sonderzeichen ist, muss es mit einem einfachen Backslash (\) escaped werden, damit es als gewöhnliches + interpretiert wird. So entspricht \+ dem Zeichen + im String.