# Einführung in Regex Regex (engl. für *Regular Expression*) oder auch reguläre Ausdrücke sind Zeichenketten die mithilfe von syntaktischen Regeln eine Menge von Zeichenketten beschreibt. Zu den Anwendungsmöglichkeiten zählen unter anderem Filtrierkriterien in der Textsuche beziehungsweise sogenanntes Pattern Matching. Heutzutage werden die meisten Regex Zeichenfolgen generiert oder es wird eine Vorlage genutzt. Es kann trotzdem wertvoll sein, die Grundlagen der Syntax zu verstehen und interpretieren zu können. Anschliessend werden wir uns die wichtigsten Regeln anschauen: ## Regex in der Praxis Ein regulärer Ausdruck wird regulär aus den Zeichen des zugrunde liegenden Alphabets in Kombination mit den Metazeichen `[ ] ( ) { } | ? + - * ^ $ .` gebildet. Die jeweilige Metaeigenschaft eines Zeichens kann über ein *Backslash* (`\`) aufgehoben werden. ### Zeichenauswahl Mit den eckigen Klammern (`[ ]`) kann man eine Zeichenauswahl definieren. Der Ausdruck in den eckigen Klammern steht dann für genau ein Zeichen aus dieser auswahl. Die Zeichenauswahl kann bestimmte Zeichen sein oder auch einen Bereich. Je nach Kontext können gewisse Zeichen auch eine andere Bedeutung haben. Mit einem `^` am Anfang einer Zeichenklassendefinition negiert man die Bedeutung beispielsweise. | Ausdruck | Bedeutung | | -------- | -------------------------------------------------------------------- | | [asd] | Alle Zeichen die entweder a, s, oder d sind werden als Match gezählt | | [A-Z] | Alle grossen Buchstaben im Alphabet werden gezählt | | [3-6] | Alle Zahlen zwischen 3 und 6 werden gezählt | | [\^asd] | Alle Zeichen ausser a, s, und d werden gezählt | ### Vordefinierte Zeichenklassen Es gibt auch vordefinierte Zeichenklassen welche sich änlich einer Zeichenauswahl verhält. Die wichtigsten sind: | Zeichenklasse | Bedeutung | | ------------- | -------------------------------------------------------------------------------------------------------------------------- | | \d | (digit) Alle Ziffern werden gezählt. Gleich wie `[0-9]` | | \D | (no digit) Alle Zeichen die keine Ziffern sind werden gezählt, Gleich wie `[^\d]` | | \w | (word character) Alle Buchstaben, Ziffern oder der Unterstrich (`_`) werden gezählt. Gleich wie `[a-zA-Z_0-9]` | | \W | (now word character) Alle Zeichen die keine Buchstaben, Ziffern oder Unterstriche sind, werden gezählt. Gleich wie `[^\w]` | | \s | (whitespace) Das Leerzeichen und die Steuerzeichen `\f, \n, \r, \t, und \v` werden gezählt | | \S | (non whitespace) Alle Zeichen die kein Withespace sind werden gezählt. Gleich wie `[^\s]` | Der Punkt (`.`) kann in einer Zeichenkette für ein beliebiges Zeichen stehen. ### Quantoren Mit Quantoren kann ein vorgehender Ausdruck in verschiedener Vielfachheit gezählt werden. Die Quantoren beziehen sich jedoch nich auf die Resultate sondern auf den ganzen Ausdruck: | Quantor | Bedeutung | | ---------- | ---------------------------------------------------------------------------------------------- | | {min, max} | Der Ausdruck muss mindestens *min*-mal und maximal *max*-mal vorkommen | | {n} | Der voranstehende Ausdruck muss exakt *n*-mal vorkommen | | {min,} | Der voranstehende Ausdruck muss mindestens *min*-mal vorkommen | | ? | Der voranstehende Ausdruck kommt kein- oder einmal vor, er ist "optional" | | + | Der voranstehende Ausdruck muss mindestens einmal vorkommen, darf aber auch mehrfach vorkommen | | * | Der voranstehende Ausdruck darf beliebig oft vorkommen, auch kein mal | Der Ausdruck `[ab]+` würde so sowohl auf *a*, *b* aber auch *aababba* und *bababa* zutreffen. ### Gruppierungen Bei eienr Zeichenauswahl werden die Zeichen in beliebiger Reihenfolge gezählt. Will man eine bestimmte Abfolgen von Zeichen abrufen, muss eine Gruppierung genutzt werden. Diese werden über Klammern ausgezeichnet [`( )`]. | Gruppierung | Bedeutung | | ----------- | ----------------------------------- | | (abc) | Alle Vorkommen der Zeichenfolge abc | | (go+gle) | google mit beliebig vielen o | | \w+(\.com) | Alle auf .com endenden Wörter | ### Weitere Zeichen | Zeichen | Bedeutung | | ------- | ----------------------------------------------------------------------- | | ^ | Zeilenanfang. Nicht zu verwechseln mit ^ innerhalb der Eckigen Klammern | | $ | Zeichenkettenende | | \b | Leere Zeichenkette am Wortanfang oder am Wortende | | \B | Leere Zeichenkette die nicht am Anfang oder am Ende eines Wortes steht | | \\< | Leere Zeichenkette am Wortanfang | | \\> | Leere Zeichenkette am Wortende | ## Fazit Regex bietet viele verschiedene Möglichkeiten um die Suche nach bestimmten Mustern in Zeichenabfolgen zu definieren. Es kann auf den ersten Blick beängstigend sein, ist aber eigentlich nicht so schwierig, wenn die Grundlegenden Kategorien verstanden wurden. Es empfiehlt sich aber durchaus, einen Spick mit den verschiedenen Definition bereit zu haben, da es doch ziemlich viele gibt.