Reguläre Ausdrücke (regular expressions) sind ein Standardwerkzeug zum Patternmatching auf Textdaten.
Wir verwenden diese z. B. zum Suchen und Ersetzen in Textdateien,
im Rahmen der Entwicklung von Lexern und Parsern,
um Eingaben zu überprüfen (Sanitizing) oder
um Wörterbücher, Leaks und weitere Kontextinformationen zu Passwortkandidaten zu verarbeiten.
Reguläre Ausdrücke beschreiben reguläre Sprachen und können durch einen endlichen Automaten erkannt werden.
Reguläre Ausdrücke nehmen - im Normalfall - immer einen maximalen Musterabgleich vor (greedy matching / eager matching).
Fokus ist hier auf grundlegende reguläre Ausdrücke.
Es gibt verschiedene Dialekte von regulären Ausdrücken. Hier wird der Dialekt verwendet, der von GNU grep mit der Option -E (Extended Regular Expressions) unterstützt wird. Einige Beispiele verwenden Perl-kompatible reguläre Ausdrücke (PCRE), die mit grep -P genutzt werden können.
Buchstaben und Zahlen können direkt in einem regulären Ausdruck verwenden, um entsprechenden Text zu finden. Zum Beispiel steht "a" für das Zeichen a.
1 echo -n "abc" | grep -E "a"
findet: a
Der Punkt repräsentiert ein beliebiges Zeichen - außer den Zeilenumbruch.
1 echo -n "abc" | grep -E "a."
findet: ab
Klassen von Zeichen können in eckigen Klammern angegeben werden "[]".
1 echo -n "abcdefg" | grep -E "[acg]"
findet: a, c, g
Klassen können auch durch Bereiche beschrieben werden (a-z, A-Z, 0-9):
1 echo -n "ab12xy" | grep -Eo "[a-z]"
findet: a, b, x, y
Welche Buchstaben genau durch eine Klasse repräsentiert werden hängt von den Spracheinstellungen ab!
1 LANG=de_DE.UTF-8; echo "aä" | grep -Eo "[a-z]"
findet: a, ä
aber
1 LANG=C; echo "aä" | grep -Eo "[a-z]"
findet „nur“: a
Die Negation einer Klasse wird durch an ein ^ direkt am Anfang der Klasse erzwungen.
1 echo "abc123" | grep -Eo "[^a-z]"
findet: 1, 2, 3
Der Backslash \ dient als Escapezeichen für Sonderzeichen.
1 echo "abc-123[a-z]" | grep -Eo "\[a-z\]"
findet: [a-z] (aber nicht "abc")
^: Steht für den Anfang einer Zeile.
$: steht für das Ende einer Zeile.
1$ echo "abcabcabc" | grep -Eo "abc"2abc3abc4abc5$ echo "abcY_abcZ" | grep -Eo "^abc."6abcY7$ echo "XbcYbc" | grep -Eo ".bc$"8Ybc
*: "null oder mehr" Vorkommen des vorherigen Zeichens oder Musters.
+: "ein oder mehr" Vorkommen des vorherigen Zeichens oder Musters.
?: "null oder ein" Vorkommen des vorherigen Zeichens oder Musters.
1$ echo "Sa--aa--aaaE" | grep -Eo "aa*"2a, aa, aaa3$ echo "Sa--aa--aaaE" | grep -Eo "aa+"4aa, aaa5$ echo "Sa--aa--aaaE" | grep -Eo "a?"6a, a, a, a, a, a
{X,Y}: zwischen X und Y Vorkommen des vorherigen Zeichens oder Musters. Die obere Grenze ist optional, um zum Beispiel X und mehr Vorkommen zu finden.
1$ echo "Sa--aa--aaaE" | grep -Eo "a{2,2}"2aa3aa4$ echo "Sa--aa--aaaE" | grep -Eo "a{2,3}"5aa6aaa
| trennt verschiedene Alternativen.
1$ echo "HundMausAffe" | grep -Eo "Hund|Affe"2Hund3Affe
Aufgrund des „gierigem“ Musterabgleichs ist bei dem Abgleich von Alternativen im Allgemeinen darauf zu achten, dass zuerst auf längere bzw. spezifischere Muster geprüft wird. Die Regeln sind jedoch
1$ echo "Schifffahrt" | grep -Eo "Schiff|Schifffahrt"2Schifffahrt34# Perl compatible (requires GNU grep)5echo "Schifffahrt" | grep -Po "Schiff|Schifffahrt"6Schiff
() dienen der Gruppierung von Teilausdrücken und der Referenzierbarkeit bzw. Rückreferenzen mittel $<NR> wobei NR die Nummer der Gruppe ist.
Beispiel: der folgende Ausdruck findet Zeichenketten, die mit dem Zeichen aufhören mit dem sie begonnen haben.
1$ echo "XaaaaX" | grep -Eo "^(.).*\1$"2XaaaaX34$ echo "XaaaaY" | grep -Eo "^(.).*\1$"
(?=...): ist ein positiver Lookahead und stellt sicher, dass ein bestimmtes Muster im Text folgt, ohne es selbst in das Ergebnis aufzunehmen.
(?!...): ist ein negativer Lookahead und stellt sicher, dass ein bestimmtes Muster im Text nicht folgt.
1$ echo "HundKatzeHundMaus" | grep -Po 'Hund(?=Katze).{1,2}'2HundKa34$ echo "HundKatzeHundMaus" | grep -Po 'Hund(?!Katze).{1,2}'5HundMa
(?:...): definiert eine Gruppe, die nicht für Rückreferenzen verwendet wird. (Primär für Effizienz.)
1$ echo "abcabc" | grep -Po '(?:abc){2}'2abcabc
*?: match 0 oder mehr Vorkommen des vorherigen Zeichens oder Musters, aber so wenige wie möglich/nötig
+?: match 1 oder mehr Vorkommen des vorherigen Zeichens oder Musters, aber so wenige wie möglich/nötig
(??): match 0 oder 1 Vorkommen des vorherigen Zeichens oder Musters, aber so wenige wie möglich/nötig
1$ echo '<div>Hallo</div><div>Welt</div>' | grep -Eo '<.*?>'2<div>3</div>4<div>5</div>6$ echo '<div>Hallo</div><div>Welt</div>' | grep -Eo '<.*>'7<div>Hallo</div><div>Welt</div>
Schmetterling in Rockyou
Prüfen Sie ob der Begriff: schmetterling oder Schmetterling in der Datei rockyou.txt vorkommt.
Wiederholungen von Zeichen in Passwörtern
Finden Sie alle Passworte in denen ein Zeichen mind. 3 oder mehrmals wiederholt wird. z. B. "x0000!" oder "aaaabbbb".
Wiederholungen von Sequenzen in Passwörtern
Finden Sie alle Passworte, in denen eine Sequenz mit mindestens 3 Zeichen wiederholt wird, z. B. „TestTest“ oder „1AffeIstAffe#“.
Kein Sonderzeichen danach
Finden Sie alle Buchstabensequenzen mit ein bis drei Zeichen, bei denen das letzte Zeichen nicht gefolgt wird von einem Sonderzeichen (z. B. ab und de in „abc_def_“).