Reguläre Ausdrücke (Regular Expession)

Ein regulärer Ausdruck stellt eine Zeichenkettenbeschreibung dar und besteht aus 3 Teilen. 
/ pattern / i


Delimiter (Begrenzer):
Das eigentliche Muster wird von sogenannten Delimitern am Anfang und am Ende begrenzt, damit für den Interpreter ersichtlich ist, wo das Muster anfängt und wo es aufhört. Jedes nicht-alphanumerische Zeichen außer dem \ darf als Delimiter genutzt werden. Es ist also nicht zwingend nötig den /  als Delimiter zu nutzen.
Oft verwendete Begrenzer:

/    Schrägstrich
~   Tilde
@  [at]
%  Prozentzeichen
!    Ausrufezeichen


Modifier

An den abschließenden Delimiter können sogenannte Modifier angehängt werden, welche das gesamte Suchmuster betreffen. So kann z.B. durch anhängen eines i dafür gesorgt werden, dass die Suche unabhängig von Groß-/Kleinschreibung funktioniert, was z.B. für Suchfunktionen in Datenbanken oder auf Homepages sehr vorteilhaft ist.
Im folgenden eine Liste einiger Modifier und ihrer Funktion.
i   Der am meistgebrauchteste Modifier ist i. Die Unterscheidung zwischen Groß- und Kleinschreibung wird deaktiviert.
s   Hängt man den s Modifier an, so interpretiert der Parser den übergebenen Text als eine Zeile. Das heisst, unabhängig von diversen Newline-Metacharakteren (\n) wird der gesamte übergebene Text als eine "Zeile" behandelt. Das s kann man also für single-lined ansetzen.
m   Der m Modifier ist das genaue Gegenstück zum s Modifier und sorgt dafür, dass die übergebene Zeichenkette, als mehrzeilig (multiple-lines) interpretiert wird. Das heisst, dass der Metacharakter ^ jeweils auf den Anfang jeder neuen Zeile zutrifft. Neue Zeilen werden durch ein Newline (\n) eingeleitet.
U   Der Modifier u sorgt dafür, dass die Quantoren nicht „gierig“ sind. Sollte man den Modifier nicht anhängen, so kann es schon mal sein, dass ein Quantifier mehr Zeichen der Zeichenkette betrachtet als eigentlich nötig, da der Parser probiert auf einen möglichst großen Text zu passen.
g   Hört nach dem ersten Treffer nicht auf nach dem Suchmuster zu suchen., ist also „gierig“ und die Voreinstellung.

Pattern (Suchmuster)
Quantoren erlauben für ein oder mehrere Zeichen die Angabe der minimalen, maximalen oder exakten Anzahl dieser Zeichenfolge.
Wird kein Quantoren angegeben, so wird davon ausgegangen, dass das Zeichen einmal vorhanden sein muss.
 
 Zeichengruppe    Abkürzung
[a-zA-Z_0-9] Buchstaben, Ziffern und Unterstrich  \w
[^a-zA-Z_0-9] Alles außer Buchstaben, Ziffern und Unterstrich  \W
[0-9] Ziffern  \d
[^0-9] Alles außer Ziffern  \D
[ \n\t…] Whitespaces  \s
[^ \n\t…] Alles außer Whitespaces  \S
.   (Punkt) Jedes Zeichen außer Newline  .
[+-*] Sonderzeichen werden einfach hinzufügen  
^ (Zirkumflex) Negation - Ausschluss der Zeichenklasse.
Muss innerhalb der eckigen Klammer [] stehen !
 
Die eckigen Klammern umschließen eine Liste, einen Bereich von Zeichen oder beides. [abc] z.B. bedeutet jedes einzelne Zeichen, das a, b oder c ist. Ein Bindestrich (-) zwischen zwei Zeichen definiert einen Bereich. [a-z] z.B. bedeutet jedes einzelne Zeichen vom kleinen "a" bis zum kleinen "z"".  Einer Zeichengruppe können *, ?, +, or {min,max} folgen.
[0-9]+ z.B. findet ein oder mehrere aufeinanderfolgende Vorkommen jeder Ziffer; deswegen findet es xyz123 aber nicht abcxyz.  Listen und Bereiche können kombiniert werden. [a-zA-Z0-9_] z.B. bedeutet jedes einzelne Zeichen, das ein Buchstabe, eine Ziffer oder ein Unterstrich ist.
 
 
Quantoren Bsp:
  . Der Punkt steht für jedes einzelne Zeichen
mit Ausnahme des Zeilenvorschubs (`r und `n).
ab. findet z.B. abc und abz und ab_
  *  Der Stern findet entweder kein, ein oder mehrere aufeinanderfolgende Vorkommen der/des voranstehenden Zeichens oder einer (Zeichengruppe) oder eines (Teilmusters). 

 Wildcard: Das dot-star Muster .* ist das allgemeingültigste Muster, weil es sowohl für kein als auch mehrere Vorkommen jedes Zeichens (ausgenommen Zeilenvorschub: `r und `n) einen Treffer liefert.

a* findet z.B. ab und aaab. Es liefert auch einen Treffer auf der Position des ersten Zeichens einer Zeichenfolge, die überhaupt kein "a" enthält.

abc.*123 z.B. findet sowohl abcAnything123 als auch abc123

  +  Das Pluszeichen findet ein oder mehrere aufeinanderfolgende Vorkommen der/des voranstehenden Zeichens,  Zeichengruppe oder Teilmusters. a+ z.B. findet ab und aaab.
Aber anders als a* und a? liefert a+ keinen Treffer, wenn die zu durchsuchende Zeichenfolge kein "a" enthält.
  ? Das Fragezeichen findet entweder kein oder genau ein Vorkommen der/des voranstehenden Zeichens,  Zeichengruppe oder Teilmusters. Man kann sich das als "das voranstehende Zeichen ist optional" vorstellen. colou?r z.B. findet color und colour weil das "u" optional ist.
 {n}  Steht für genau n Zeichen. Bsp: /a{3}/
Steht für exakt drei a hintereinander.
{n,} Steht für mindestens n Zeichen. Bsp: /a{1,}/
Steht für mindestens ein a und ist somit gleichbedeutend mit /a/ und /a+/
{n,m}   Steht für mindestens n, aber maximal m Zeichen. Bsp: /a{1,3}/
Steht für alle Zeichenketten, die 1, 2 oder 3 a’s hintereinander enthalten.

Auswahl    
 |  Die Pipe steht für eine Wahl
(oder) und muss in eine runde Klammer gesetzt werden
Bsp: ('|\") bzw. ("|\')
Steht für einfaches oder doppeltes Anführungszeichen.
     
 
Meta-Zeichen Bedeutung  
 ^ Beginn einer Zeichenkette Bsp.^a[^bc]$ 
 $ Ende einer Zeichenkette  Beginnt mit einem a und dann alles außer b oder c
 

Zeichen die mit einem Backslash im Text gekennzeichnet werden müssen 
Quantoren \.      \*     \+     \?    \{     \}     \[     \]     \(     \)
Delimiter \/
 
Weitere Beispiele:
[a-f] Kleinbuchstaben von a bis f
[abcxzy] die kleinen Buchstaben a, ab, c , x, y und z sind gültig.

Eine Zeichenklasse gibt eine Auswahl von erlaubten Zeichen an.
Beispiel: /^a[xy]/

Dies trifft auf ax und ay zu. Zwar könnte man hier auch noch ohne weiteres mit einer normalen runden Klammer und einem | agieren, im folgenden Beispiel wird es allerdings evtl. schon deutlicher, wo der Vorteil von Charakterklassen liegt.
Beispiel: /^a[0-9]/

Dieses Muster passt auf a0, a1, a2, ..., a9 und damit sollte der Vorteil von Charakterklassen endgültig klar sein.
Gleichzeitig haben wir hier eines von zwei Sonderzeichen in einer Charakterklasse kennengelernt, nämlich den Bindestrich - . Der Bindestrich gibt, wie man es sich auch logischerweise denken könnte eine Reichweite an.
Beispiel: /^[a-zA-Z]+/

nutzen. Wenn man nun noch bestimmte Sonderzeichen hinzufügen kann, so kann man diese einfach zusätzlich hineinschreiben.
[0-9+-*\/]

Würde also auf alle Zeichen eines einfachen Taschenrechners ansprechen.
Dabei muss der / durch einen vorrangestellten \ maskiert werden, sofern ihr den / als Pattern-Delimiter nutzt.

Das zweite Sonderzeichen in Charakterklassen ist der Zirkumflex ( ^ ). Dies ist wiederum ein etwas verwirrender Punkt, da der Zirkumflex ja eigentlich den Beginn der Zeichenkette markiert. In einer Charakterklasse hat ^ allerdings eine negierende (verneinende) Aufgabe.
Beispiel: /^a[^bc]$/

Dieses Muster triff auf alle Zeichenketten zu, die ein a Anfang haben, außer ab und ac.

Dadurch kann der Ausdruck nochmal gekürzt werden:

[a-z]{3}

Quantoren sind von Natur aus gierig, d.h. sie nehmen so viel Platz ein wie nur möglich. Mit folgenden Ausdruck soll einen HTML-Tag gefunden werden:

<.+>

Soweit so gut. Bsp:

<h1><font color=#0000FF>proggen.org</font></h1>

Zuerst könnte man annehmen wir bekommen folgende Matches:

<h1>

<font color=#0000FF>

</font>

</h1>

Wenn aber bedacht wird, dass der Quantor '+' so viel Platz wie nur möglich in Anspruch nehmen, ergibt es nur einen einzigen

<h1><font color=#0000FF>proggen.org</font></h1>

Ja, '+' beschlagnahmt kompletten Text vom ersten '<' bis zum letzten '>'. Dieses Verhalten kann geänder werden, indem ein Fragezeichen nach einem Quantor geschrieben wird:

<.+?>

Führt zur erwarteten Ausgabe.


Gruppen

Zeichenketten und -klassen können auch zu einer Gruppe zusammengefassen werden. Dazu wir einfach der Ausdruck zwischen runde Klammern gesetzt:

([pP]erl)

Damit wurde bereits eine einfache Gruppe erstellt. Im nachfolgenden Teil des regulären Ausdrucks kann jetzt wieder mit einer Rück-Referenz auf diese Gruppe bezogen werden. Um sich auf eine Gruppe zu beziehen wird entweder \g{index} mit dem Index der Gruppe (beginnend bei 1!) geschrieben oder direkt der Index als Escape-Sequenz. Negative Indizes beginnen von hinten zu zählen. Folgende reguläre Ausdrücke zum Finden des Inhalts eines HTML-Tags (Ergebnis in Gruppe 2) sind also äquivalent:

<(.+?)>(.*)</\g{1}>
<(.+?)>(.*)</\g{-2}>
<(.+?)>(.*)</\1>

Einer Gruppe kann ein Namen vergeben werden, über den sie später schnell wieder gefunden wird:

<(?<Tag>.+?)>(.*)</\k<Tag>>

Wie im Beispiel demonstriert erfolgt Zuweisung über (?<name>) und die Dereferenzierung durch \k<name>.
Es ist ebenfalls möglich Bedingungen in Gruppen zu formulieren, dazu wird das in vielen Programmiersprachen als „oder“-verwendete Zeichen '|' innerhalb einer Gruppe geschrieben.

(Perl|Python) gefällt mir (sehr gut|nicht).

Dieses Muster passt auf folgende Texte:

Perl gefällt mir sehr gut.
Python gefällt mir sehr gut.
Perl gefällt mir nicht.
Python gefällt mir nicht.
Weitere Meta-Zeichen und Escape-Sequenzen
Escape-SequenzBedeutung
\b Beginn oder Ende eines Wortes
\B Alles außer der Beginn oder Ende eines Wortes


Backreferences
Backreferences sind, wie die Übersetzung schon sagt, Rückbezüge. Und zwar sind es Rückbezüge, die sich auf einen vorangegangenen Teil des Patterns (in runden Klammern) bezieht und den Inhalt dieser (Klammer) enthält. Dazu gibt es generell zwei verschiedene Arten der Syntax. Die neuere davon ist $n, die ältere \\n, wobei n für die n-te Klammerngruppe steht.
Beispiel: !(&lt;b&gt;|&lt;i&gt;>)(.*?)(&lt;/$1&gt;)!

Dieses Muster trifft also auf &lt;b&gt;test&lt;/b&gt; aber auch &lt;i&gt;test&lt;/i&gt;, nicht aber auf &lt;b&gt;test&lt;/i&gt; zu.


Regex-Beispiele
mit der Texteingrenzung ^$ so dass nur genau der Text gefunden wird
Email
Bis zu einem Toplevel-Domain Länge von 3 Zeichen. z.B. Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.
Da es jetzt eine Vielzahl von längeren TDL's gibt muss die 3 wohl auf 18 angepasst werden.
/^([a-z0-9-_.]+\@[a-z0-9-.]+\.[a-z]{2,3})$/

IP4-Bereich
Im 3.Oktett 2 Bereiche: 192.168.170.0 bis 192.168.171.255
/^192\.168\.17(0|1)\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/ 

Im 3.Oktett die Bereiche 170 bis 179: 192.168.170.0 bis 192.168.179.255
/^192\.168\.17[0..9]\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/ 
 
IP4-Adresse (allg.)
z.B. 192.168.0.0 (Zahl und dann 3mal Punkt&Zahl zw. 0 u. 255)
/^([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}$/
Ganz exakt indem eine führende 0 verhindet wird
/
^([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]){3}$/
 
IPv6-Adresse (allg.)
z.B.
::1030:A54:0:2:73AA
::
2020:23E3::78F3:1523
/^(([0-9A-Fa-f]{1,4}:){1,7}|:)(:|([0-9A-Fa-f]{1,4}:){1,7})$/
 
HTTP(S) und FTP-URL
mit einer TLD-Länge von bis zu 3
z.B. https://alant.com
/^([Hh][Tt][Tt][Pp][Ss]?|[Ff][Tt][Pp]):\/\/([a-z0-9-.]+\.[a-z]{2,3})$/

MAC-Adresse
Erlaubt als Zahlentrenner - : Leezeichen
z.B. AB:15:2C:00:1C:AF
/^(^[\dA-Fa-f]{2}([-: ]?[\dA-Fa-f]{2}){5}$/
 
 
 
Regex testen
 

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.