Basics zu regulären Ausdrücken

Um ehrlich zu sein war dieses Thema für mich früher immer abschreckend. Dazu kommt, dass ich nie wirklich Lust hatte mich damit auseinanderzusetzen. Nachdem ich nun von Zeit zu Zeit dazu gezwungen war das Thema anzugehen, hatte sich herausgestellt, dass reguläre Ausrücke gar nicht so schlimm sind, wie ich Anfangs dachte. Dieser Beitrag soll euch also helfen den Einstieg in diese Thematik zu finden.

Was sind denn un reguläre Ausdrücke? Nun, um es einfach zu sagen, ein regulärer Ausdruck ist eine Zeichenkette. Diese Zeichenkette beschreibt eine Menge an Zeichenfolgen. Klingt verwirrend, ist es aber gar nicht, wenn man sich klar macht, was dies bedeutet. Sagen wir mal, dass wir einen regulären Ausdruck haben, der folgendermaßen aussieht: Fünf mal ein a und danach 3 mal ein b. Die Menge aus Zeichenfolgen sieht nun so aus: aaaaabbb. Schwierig zu verstehen sind reguläre Ausdrücke deshalb, weil sie nicht in der Form, so wie ich es aufgeführt habe, notiert werden. Die Notation beschränkt sich auf sogenannte Meta-Characters (welche mich im Übrigen lange davon abgehalten haben mit ihnen zu arbeiten): ]($^., usw. usw. usw. Ich werde nun einige davon vorstellen, damit ihr nachher (falls ihr sie später seht) sofort sagen könnt “Ah, stimmt ja, das war ja dieses Zeichen und es bedeutet das und das!”

Character Class “[ ]“
Die wunderschönen eckigen Klammern [ ] bieten die Möglichkeit einen Character aus der Klasse (einer Menge an Charactern) zu matchen. Dazu ein kleines Beispiel. Ich möchte die Wörter hot und hat in einem bestimmten Text finden. Ausgeschrieben bedeutet meine Anforderung: Suche ein h gefolgt von einem o oder einem a. Der letzte Buchstabe ist ein t. Als regulärer Ausdruck sieht das nun so aus: h[oa]t.

Character Class Bereiche “-”
Bei einer Character Class existiert auch die Option Bereiche festzulegen. Nehmen wir mal an, ich möchte eine Zeichenfolge haben, die mit einer Zahl aus dem Bereich 1-9 beginnt und von einem der Buchstaben a,b oder c gefolgt wird. Mit der weiter oben beschriebenen Methode würde sich nun [0123456789][abc] anbieten. Mit den Bereichen ist dies allerdings um einiges einfacher zu realisieren: [0-9][a-c]. Zu beachten ist an dieser Stelle, dass der Bindestrich nur innerhalb der eckigen Klammern als “Metacharacter” erkannt wird. Ausserhalb ist der Binderstrich nur ein normales Zeichen.

Metacharacter Dot “.”
Der Punkt ist eigentlich am einfachsten zu erklären. Er bietet euch die Möglichkeit gegen ein beliebiges Zeichen zu matchen. Ein wenig tricky ist der Punkt, weil er nur ausserhalb von Character Klassen als Metacharacter erkannt wird. Aber wenn man dies im Hinterkopf behält, ist auch das ein sehr geringes Problem.

Metacharacter Optional “?”
Das Fragezeichen markiert ein Zeichen als optional. Wozu könnte dies nun gut sein? Schauen wir uns doch mal das Wort schifffahrt an. Ich habe es mal direkt mit drei “f”s geschrieben. Es gibt aber auch eine nicht zu kleine Gruppe an Personen, die das Wort mit nur zwei “f”s schreiben (kommt natürlich auf die gerade gültige Rechtschreibung an). Ich möchte dieses Wort nun in einem Text wiederfinden, egal ob es nun mit zwei oder mit drei “f”s geschrieben ist. Im Klartext: Ich möchte das dritte “f” als optional markieren. Der dazugehörige reguläre Ausdruck sieht nun so aus: schifff?ahrt. An und für sich eine recht komplexe Aufgabenstellung, die mit einem regulären Ausdruck ganz geschickt lösbar ist, dank Metacharacter “?”.

Metacharacter Alternative “|”
Wer aus dem “Programmierer-Bereich” kommt, wird dieses Zeichen sehr gut kennen. Der senkrechte Strich signalisiert, dass es hier Alternativen gibt (die ODER Verküpfung). Deutlich wird dies am Wort dass, welches wir aber auch so schreiben könnten: daß. D.h. wir möchten eine Zeichenfolge haben, die mit einem d beginnt, von einem a gefolgt wird und danach entweder das doppel-s oder ein scharfes s enthält. Der reguläre Ausdruck da(ss|ß) kann uns bei dieser Aufgabenstellung helfen. Die runden Klammern grenzen den Umfang der Alternativen ein.

Man könnte nun recht lange fortfahren. Da dieser Beitrag nur ein kleiner Einstieg in die Thematik sein sollte, werde ich an dieser Stelle auf weitere Beispiele verzichten und hoffe, dass es euch Spaß gemacht hat zu lesen und weiterhelfen konnte.


Leave a Reply