Reguläre Ausdrücke (engl. regular ex­pres­si­ons) auch Regex genannt, sind Zei­chen­ket­ten auf Basis syn­tak­ti­scher Regeln, die es er­mög­li­chen, Zei­chen­fol­gen zu be­schrei­ben. Als solche sind sie Be­stand­teil der regulären Sprachen – einer Un­ter­grup­pe der formalen Sprachen, die ins­be­son­de­re in der In­for­ma­ti­ons­tech­nik und speziell in der Software-Ent­wick­lung, von großer Bedeutung ist.

Was ist ein regulärer Ausdruck?

Reguläre Ausdrücke (engl. regular ex­pres­si­ons) sind die Be­schrei­bungs­ein­hei­ten regulärer Sprachen, die zu den so­ge­nann­ten formalen Sprachen zählen. Sie sind ein zentrales In­stru­ment der theo­re­ti­schen In­for­ma­tik, die unter anderem die Grundlage für die Ent­wick­lung und Aus­füh­rung von Com­pu­ter­pro­gram­men sowie den Bau der dafür er­for­der­li­chen Compiler bildet. Aus diesem Grund finden reguläre Ausdrücke – die häufig auch als Regex be­zeich­net werden und auf klar de­fi­nier­ten, syn­tak­ti­schen Regeln basieren – ins­be­son­de­re in der Software-Ent­wick­lung Ver­wen­dung.

Zu jedem regulären Ausdruck existiert ein so­ge­nann­ter endlicher Automat (auch Zu­stands­ma­schi­ne genannt), der die vom Ausdruck spe­zi­fi­zier­te Sprache ak­zep­tiert und sich mithilfe der Thompson-Kon­struk­ti­on aus einem regulären Ausdruck ent­wi­ckeln lässt. Auf der anderen Seite gibt es für jeden endlichen Automaten auch einen regulären Ausdruck, der die vom Automaten ak­zep­tier­te Sprache be­schreibt. Dieser lässt sich wahlweise durch den Kleene-Al­go­rith­mus oder das Eli­mi­nie­ren von Zuständen erzeugen.

Hinweis

Ein Automat ist ein Ver­hal­tens­mo­dell, das aus Zuständen, Zu­stands­über­gän­gen und Aktionen besteht. Als endlich wird er dann be­zeich­net, wenn die Menge an Zuständen, die er annehmen kann, endlich (also be­schränkt) ist.

Ein bekanntes Beispiel für die Nutzung regulärer Ausdrücke in der In­for­ma­ti­ons­tech­nik ist die Suchen-und-Ersetzen-Funktion von Text­edi­to­ren, die der Com­pu­ter­pio­nier Ken Thompson – einer der Ent­wick­ler des UNIX-Be­triebs­sys­tems – erstmals in den 1960er-Jahren in den zei­len­ori­en­tier­ten Editor QED und später in dessen Nach­fol­ger ed im­ple­men­tiert hatte. Diese Funktion er­mög­licht es, bestimmte Zei­chen­fol­gen in Texten zu suchen und – sofern gewünscht – durch eine beliebige andere Zei­chen­fol­ge zu ersetzen.

Wie funk­tio­niert ein regulärer Ausdruck?

Ein regulärer Ausdruck kann wahlweise aus­schließ­lich durch normale Zeichen (z. B. abc) oder durch eine Kom­bi­na­ti­on von normalen Zeichen und Me­ta­zei­chen (z B. ab*c) gebildet werden. Die Me­ta­zei­chen haben dabei die Aufgabe, bestimmte Zei­chen­kon­struk­tio­nen bzw. -an­ord­nun­gen zu be­schrei­ben – also bei­spiels­wei­se, ob ein Zeichen am Zei­len­an­fang stehen soll oder ob ein Zeichen exakt einmal oder auch häufiger bzw. seltener vorkommen darf bzw. soll. Die beiden genannten Beispiele regulärer Ausdrücke funk­tio­nie­ren zum Beispiel fol­gen­der­ma­ßen:

abc: Das einfache Regex-Muster abc erfordert eine exakte Über­ein­stim­mung. Es wird also nach Zei­chen­ket­ten gesucht, in denen die Zeichen „abc“ nicht nur allesamt enthalten sind, sondern auch in exakt dieser Rei­hen­fol­ge auftreten. Die vom Ausdruck ge­for­der­te Über­ein­stim­mung bieten daher sowohl die Frage „Kennst du das abc?“ als auch der Satz „Das müssen wir noch abchecken.“.

ab*c: Reguläre Ausdrücke mit Son­der­zei­chen funk­tio­nie­ren hingegen etwas anders, da nicht nur nach exakten Über­ein­stim­mun­gen, sondern auch spe­zi­el­len Szenarios gesucht wird. Das Sternchen (auch „Asteriks“ genannt) sorgt im vor­lie­gen­den Fall dafür, dass zwar nach Zei­chen­ket­ten gesucht wird, die mit dem Buch­sta­ben „a“ beginnen und mit dem Buch­sta­ben „c“ enden – da­zwi­schen kann sich al­ler­dings eine beliebige Zahl des Buch­sta­ben „b“ befinden, sodass eine Über­ein­stim­mung in „abc“ als auch in den Zei­chen­ket­ten „abbbbc“ und „cbbabbcba“ vorliegt.

Jeder Regex lässt sich darüber hinaus mit einer konkreten Aktion ver­knüp­fen – wie zum Beispiel dem bereits genannten „Ersetzen“. Diese Aktion wird überall dort aus­ge­führt, wo der jeweilige reguläre Ausdruck zutrifft – also überall dort, wo wie in den ge­schil­der­ten Bei­spie­len eine ent­spre­chen­de Über­ein­stim­mung vorliegt.

Welche Her­aus­for­de­run­gen sind mit dem Einsatz regulärer Ausdrücke verbunden?

Wer mit Regex-An­wei­sun­gen arbeiten möchte, der hat dabei eine Menge Frei­hei­ten, denn zu jeder Auf­ga­ben­stel­lung, die man mit einem regulären Ausdruck lösen möchte, gibt es immer mehrere Lö­sungs­op­tio­nen. Dass sich ein ge­wünsch­tes Resultat auf ver­schie­de­nen Wegen erzielen lässt, ist al­ler­dings nicht immer ein Vorteil:

So können Sie die An­wei­sun­gen zum Beispiel sehr allgemein halten, um das ge­wünsch­te Ziel in jedem Fall zu erreichen – wollen Sie ein möglichst akkurates Ergebnis erhalten, kommen Sie al­ler­dings nicht darum herum, ein spe­zi­fi­sches Regex-Muster zu for­mu­lie­ren. Auch ein ge­ne­rel­ler Blick auf die Länge ist emp­feh­lens­wert: Je kompakter ein regulärer Ausdruck ist, desto geringer fällt auch seine Ver­ar­bei­tungs­dau­er aus. Dabei sollten Sie al­ler­dings wiederum nicht die Les­bar­keit aus den Augen verlieren. Denn falls Sie ver­wen­de­te reguläre Ausdrücke später ändern möchten, stellt es ein großes Hindernis dar, wenn die ur­sprüng­li­chen An­wei­sun­gen zu kom­pli­ziert und darüber hinaus un­kom­men­tiert sind.

Generell gilt es bei der Er­stel­lung regulärer Ausdrücke also, das optimale Ver­hält­nis zwischen Kom­pakt­heit und Spe­zi­fi­tät zu finden.

Welche syn­tak­ti­schen Regeln gelten für reguläre Ausdrücke?

Wie bereits erwähnt, lassen sich reguläre Ausdrücke in ver­schie­de­nen Sprachen – wie bei­spiels­wei­se Perl, Python, Ruby, Ja­va­Script, XML oder HTML – einsetzen, wobei der Nutzen bzw. die Funktion sehr ver­schie­den sein kann. In Ja­va­Script sind Regex-Muster bei­spiels­wei­se bei den String-Methoden search(), match() oder replace() im Einsatz, während die Ausdrücke in XML-Do­ku­men­ten der Be­schrän­kung von Element-Inhalten dienen. In puncto Syntax gibt es zwischen den einzelnen Pro­gram­mier- und Aus­zeich­nungs­spra­chen al­ler­dings kaum Un­ter­schie­de, wenn es um reguläre Ausdrücke geht:

So kann ein regulärer Ausdruck un­ab­hän­gig von der Sprache, in der er verwendet wird, aus bis zu drei Teilen bestehen:

Pattern (Such­mus­ter) Das zentrale Element ist das Pattern, also das generelle Such­mus­ter. Wahlweise kann es sich – wie im vorigen Abschnitt bereits erläutert – aus­schließ­lich aus einfachen Zeichen oder aus einer Kom­bi­na­ti­on von einfachen Zeichen und Son­der­zei­chen zu­sam­men­set­zen.
Delimiter (Trenn­zei­chen) Anfang und Ende des Patterns werden durch Delimiter ge­kenn­zeich­net. Grund­sätz­lich kommen als Trenn­zei­chen alle nicht-al­pha­nu­me­ri­schen Zeichen (mit Ausnahme des Back­slashs) in Frage. PHP sieht bei­spiels­wei­se wahlweise Hashtags (#pattern#), Pro­zent­zei­chen (%pattern%), Plus­zei­chen (+pattern+) oder Tilden (~pattern~) als Delimiter vor. In den meisten Sprachen werden al­ler­dings gerade An­füh­rungs­zei­chen ("pattern") oder Slashes (/pattern/) verwendet.
Modifier (Mo­di­fi­ka­tor) Modifier können einem Such­mus­ter angehängt werden, um den regulären Ausdruck zu mo­di­fi­zie­ren. So gibt es bei­spiels­wei­se den Mo­di­fi­ka­tor i, der die Case-Sen­si­ti­vi­ty aufhebt. Diese sorgt dafür, dass Groß- und Klein­schrei­bung eine Rolle spielen und stan­dard­mä­ßig für alle regulären Ausdrücke gelten.

Zu den typischen, syn­tak­ti­schen Son­der­zei­chen, die Pattern um bestimmte Optionen erweitern können, zählen folgende:

Syn­tak­ti­sche Regex-Son­der­zei­chen Funktion
[] Ein Paar eckiger Klammern kenn­zeich­net eine Zei­chen­klas­se, die immer für ein einziges Zeichen in einem Such­mus­ter steht.
() Ein Paar runder Klammern kenn­zeich­net eine Zei­chen­grup­pe, die aus einem oder mehreren Zeichen bestehen und in­ein­an­der ge­schal­tet werden können.
- Fungiert als Bereich-Angabe (von [… ] bis […]), wenn es zwischen zwei normalen Zeichen steht
^ Suche auf den Anfang einer Zeile be­schrän­ken (weitere Funktion: Negator in Zei­chen­klas­sen)
$ Suche auf das Ende einer Zeile be­schrän­ken
. Steht für jedes beliebige Zeichen
* Die Anzahl des Zeichens, der Klasse oder Gruppe vor einem Stern kann beliebig sein (null ein­ge­schlos­sen).
+ Zeichen, Klasse oder Gruppe vor einem Plus­zei­chen muss min­des­tens einmal vorhanden sein.
? Zeichen, Klasse oder Gruppe vor einem Fra­ge­zei­chen ist optional und darf maximal einmal vorkommen.
| Kenn­zeich­net zwei oder mehrere Al­ter­na­ti­ven
{n} Vor­an­ste­hen­des Zeichen oder vor­an­ste­hen­de Klasse oder Gruppe kommt exakt n-mal vor.
{n,m} Vor­an­ste­hen­des Zeichen, vor­an­ste­hen­de Klasse oder Gruppe kommt min­des­tens n-mal und höchstens m-mal vor.
{n,} Vor­an­ste­hen­des Zeichen, vor­an­ste­hen­de Klasse oder Gruppe kommt min­des­tens n-mal oder häufiger vor.
\b Wort­gren­ze bei der Suche be­rück­sich­ti­gen
\B Wort­gren­ze bei der Suche igno­rie­ren
\d Beliebige Ziffer; Kurz­schreib­wei­se für die Zei­chen­klas­se [0-9]
\D Beliebige Nicht-Ziffer; Kurz­schreib­wei­se für die Zei­chen­klas­se [^0-9]
\w Be­lie­bi­ges al­pha­nu­me­ri­sches Zeichen; Kurz­schreib­wei­se für die Zei­chen­klas­se [a-zA-Z_0-9]
\W Be­lie­bi­ges nicht-al­pha­nu­me­ri­sches Zeichen; Kurz­schreib­wei­se für die Zei­chen­klas­se [^\w]

Tutorial: Die Mög­lich­kei­ten regulärer Ausdrücke anhand von Bei­spie­len erklärt

Nachdem die vor­an­ge­gan­ge­nen Ab­schnit­te dieses Artikels die Regex-Grund­la­gen zu­sam­men­ge­fasst haben, soll das nach­fol­gen­de Tutorial die Funk­ti­ons­wei­se der prak­ti­schen Zei­chen­ket­ten ver­an­schau­li­chen. Dabei werden die ver­schie­de­nen Mög­lich­kei­ten und syn­tak­ti­schen Kniffe anhand konkreter Beispiele für reguläre Ausdrücke ver­an­schau­licht – sowohl an einfachen als auch an komplexen Aus­drü­cken.

Ein­ele­men­ti­ge reguläre Ausdrücke

Die ein­fachs­te Regex-Form ist ein Such­mus­ter, das lediglich ein einzelnes Element als Treffer vorsieht. Sofern Sie nicht ein konkretes Element suchen, lässt sich ein solcher ein­ele­men­ti­ger regulärer Ausdruck zum Beispiel pro­blem­los mithilfe einer Zei­chen­klas­se de­fi­nie­ren. Folgender Ausdruck erlaubt wahlweise die Ziffern „1“, „2“, „3“, „4“, „5“, „6“ oder „7“ als mögliches Resultat:

[1234567]

Da die Zahlen in diesem Fall direkt auf­ein­an­der­fol­gen, wäre auch folgende, ver­ein­fach­te Schreib­wei­se möglich:

[1-7]

Soll der reguläre Ausdruck da­hin­ge­hend geändert werden, dass die Ziffer „4“ von der Suche aus­ge­nom­men wird, können Sie ebenfalls die ein­fa­che­re Variante mit dem Mi­nus­zei­chen nutzen:

[1-35-7]
Hinweis

Die einzelnen Zeichen eines Regex-Patterns werden nicht durch Leer­zei­chen von­ein­an­der getrennt.

Mehr­ele­men­ti­ge reguläre Ausdrücke

Auch bei einem mehr­ele­men­ti­gen regulären Ausdruck können Sie mit Zei­chen­klas­sen arbeiten, um eine Auswahl ver­schie­de­ner Treffer zu er­mög­li­chen. Soll der Ausdruck bei­spiels­wei­se zwei Elemente erfassen, für die un­ter­schied­li­che Resultate denkbar sind, reihen Sie einfach zwei ent­spre­chen­de Zei­chen­klas­sen an­ein­an­der:

[1-7][a-c]

Auf das erste Element, eine Zahl zwischen „1“ und „7“, folgt also einer der Buch­sta­ben „a“, ein „b“ oder ein „c“. Wie bereits erwähnt, ist hierbei die Klein­schrei­bung ob­li­ga­to­risch. Bevor Sie sich an dieser Stelle aber schon mit Modifiern aus­ein­an­der­set­zen, können Sie bereits mit der folgenden, kleinen Änderung des Ausdrucks Groß­buch­sta­ben ein­be­zie­hen:

[1-7][a-cA-C]

Reguläre Ausdrücke mit op­tio­na­len Elementen

Un­ab­hän­gig davon, ob Sie mehrere Elemente innerhalb eines einzelnen regulären Ausdrucks oder mithilfe mehrerer Zei­chen­grup­pen suchen, kann es sein, dass bestimmte Elemente nur unter be­stimm­ten Vor­aus­set­zun­gen enthalten sein müssen bzw. können. Denkbar wäre dies zum Beispiel bei einem regulären Ausdruck, der alle Haus­num­mern her­aus­fil­tern soll. Solchen Fällen, in denen die Haus­num­mer aus einer einzelnen Ziffer gebildet wird, stehen dabei unter Umständen solche Treffer gegenüber, in denen die Nummer sich aus zwei oder sogar drei Ziffern zu­sam­men­setzt. Zudem gibt es Adressen, bei denen der Haus­num­mer ein Buchstabe als Zusatz angehängt wird. Abdecken lässt sich diese Ge­samt­men­ge an möglichen Kom­bi­na­tio­nen durch folgende Regex-An­wei­sun­gen:

[1-9][0-9]?[0-9]?[a-z]?

Das einzige Pflicht­ele­ment dieses Such­mus­ters ist eine Zahl zwischen „1“ und „9“. Optional können zwei Ziffern zwischen „0“ und „9“ sowie ein be­lie­bi­ger Buchstabe folgen, was jeweils durch das nach­fol­gen­de Fra­ge­zei­chen ge­kenn­zeich­net ist.

Während die Kon­struk­ti­on für drei­stel­li­ge Nummern plus zu­sätz­li­chem Buch­sta­ben noch recht über­sicht­lich ist, sähe dies bei Nummern mit bis zu zehn Ziffern deutlich anders aus. In diesem Fall empfiehlt sich der Einsatz ge­schweif­ter Klammern, wie in folgendem Beispiel regulärer Ausdrücke:

[1-9][0-9]{0,9}

Wie im vorigen Beispiel ist an erster Stelle eine Zahl zwischen „1“ und „9“ gefordert – nach­fol­gen können al­ler­dings wahlweise keine oder bis zu neun Ziffern zwischen „0“ und „9“, sodass sich das Such­re­sul­tat also aus bis zu zehn Ziffern zu­sam­men­set­zen kann.

Regulärer Ausdruck mit beliebig häufigen Wie­der­ho­lun­gen

In den bis­he­ri­gen Bei­spie­len für ein- und mehr­ele­men­ti­ge Ausdrücke war sowohl die minimale als auch die maximale Anzahl an Zeichen bekannt. Doch natürlich exis­tie­ren auch Szenarien, in denen die Zei­chen­men­ge eines Regex im Vorhinein nicht exakt fest­ge­legt werden soll. Die not­wen­di­gen Parameter sind dann das Sternchen- und das Plus­zei­chen, die es er­mög­li­chen, beliebige Wie­der­ho­lun­gen eines Zeichens bzw. einer Zei­chen­klas­se oder -gruppe zu­zu­las­sen. So lassen sich alle Zei­chen­ket­ten mit einer be­lie­bi­gen Anzahl an Ziffern (auch „null“) bei­spiels­wei­se mit folgendem regulären Ausdruck erfassen:

[0-9]*

Gleiches gilt, wenn eine konkrete Zei­chen­kom­bi­na­ti­on gesucht wird, bei der ein (oder mehrere) Zeichen beliebig häufig auftreten können. Wie in folgendem Beispiel:

ab*

Mögliche Treffer sind in diesem Fall sowohl das Wort „anfangen“ als auch „abladen“ und „abbrechen“. Soll ersteres Resultat aus­ge­schlos­sen werden bzw. das spe­zi­fi­zier­te Zeichen min­des­tens einmal vorkommen, ist statt­des­sen das Plus­zei­chen zu verwenden:

ab+

Zei­chen­klas­sen negieren

Wenn Sie reguläre Ausdrücke mit Zei­chen­klas­sen verwenden wollen, die grund­sätz­lich für ein bzw. mehrere beliebige Zeichen stehen, dabei aber ein bzw. mehrere bestimmte Zeichen als Treffer aus­schlie­ßen, benötigen Sie den Negator „^“ (Dach­zei­chen). Dieser steht immer innerhalb der Klammern einer Zei­chen­klas­se und gilt auch nur innerhalb dieser Klammern. Ein gutes Beispiel für eine negierte Zei­chen­klas­se bietet folgende Anweisung:

H[^u]nd

Bei dem zweiten Zeichen kann es sich in diesem Fall also um ein be­lie­bi­ges Zeichen außer „u“ handeln, weshalb das Wort „Hand“ die er­for­der­li­chen Über­ein­stim­mun­gen bietet. Das Wort „Hund“ bietet diese jedoch nicht, weshalb es auch nicht auf den regulären Ausdruck zutrifft.

Platz­hal­ter

Reguläre Ausdrücke er­mög­li­chen auch die Arbeit mit Platz­hal­tern, die wahlweise für ein, mehrere oder kein Zeichen (je nach ver­wen­de­tem Me­ta­zei­chen) inmitten eines Such­mus­ters stehen. Der Platz­hal­ter wird dabei durch einen Punkt erzeugt, den Sie mit den zuvor auf­ge­zähl­ten Son­der­zei­chen für Wie­der­ho­lun­gen kom­bi­nie­ren, wenn ein anderes Resultat als ein einzelnes Zeichen gewünscht ist. Derartige reguläre Ausdrücke er­mög­li­chen es zum Beispiel, eine Datenbank nach einer Person zu durch­su­chen, von der Sie zwar den Vor- und Nachnamen kennen, aber nicht wissen, ob diese noch mit einem zweiten Vornamen ein­ge­tra­gen ist:

Max .*Mustermann

Mögliche Treffer sind in diesem Fall sowohl „Max Erik Mus­ter­mann“ (sowie jede andere Kom­bi­na­ti­on mit Zweit­na­men) oder „Max E. Mus­ter­mann“ als auch „Max Mus­ter­mann“. Sollen aus­schließ­lich Varianten mit einem zweiten Vornamen be­rück­sich­tigt werden, nutzen Sie statt des Stern­chens ein Plus­zei­chen:

Max .+Mustermann

Ein gutes Beispiel für den sinn­vol­len Einsatz eines Platz­hal­ters für ein einzelnes Zeichen ist folgendes Such­mus­ter, das sowohl mit „Hase“ als auch „Hose“ über­ein­stimmt:

H.se

Al­ter­na­ti­ven

Sie haben die Mög­lich­keit, reguläre Ausdrücke so zu for­mu­lie­ren, dass es zwei oder mehrere Al­ter­na­ti­ven für eine Über­ein­stim­mung gibt. Die Al­ter­na­ti­ven gilt es dabei, durch einen senk­rech­ten Strich zu trennen – wie in folgendem Beispiel:

Baum|Blume

Eine Über­ein­stim­mung bieten also sowohl „Baum“ als auch „Blume“.

Al­ter­na­ti­ven lassen sich auch innerhalb von Wörtern bzw. Zei­chen­fol­gen for­mu­lie­ren, indem man auf Gruppen zu­rück­greift:

(Sonn|Mon|Diens|Donners|Frei|Sams)tag|Mittwoch

In diesem Beispiel ist jeder Wochentag ein po­ten­zi­el­ler Treffer, wobei alle als Al­ter­na­ti­ve an­ge­bo­te­nen Wo­chen­tag­na­men, die auf „tag“ enden dank der Grup­pie­rung durch die runden Klammern auch in der ab­ge­kürz­ten Form korrekt erfasst werden.

Gruppen

Zei­chen­grup­pen wie im Beispiel des vor­an­ste­hen­den Ab­schnitts zählen wie Zei­chen­klas­sen zu den Struk­tur­ele­men­ten regulärer Ausdrücke. Sie lassen sich durch ein Paar runder Klammern de­fi­nie­ren und stehen grund­sätz­lich für ein Pattern, das aus einem oder mehreren Zeichen besteht – genau genommen ist also jeder Regex eine Gruppe, wobei die Kenn­zeich­nung durch die Klammern in diesem Fall aber entfällt. Innerhalb der Ausdrücke gewähren Gruppen die Mög­lich­keit, Ope­ra­to­ren wie das Trenn- oder die Wie­der­ho­lungs­zei­chen (Plus und Sternchen) auf einen ge­wünsch­ten Teil­aus­druck an­zu­wen­den:

ab(cd)+

Die ge­wünsch­te beliebige Wie­der­ho­lung gilt in diesem Fall also für die Zei­chen­grup­pe „cd“, während sie bei der gleichen Schreib­wei­se ohne Klammern nur für das „d“ gelten würde. Innerhalb eines Regex gibt es keinerlei Ein­schrän­kun­gen hin­sicht­lich der Menge an ent­hal­te­nen Gruppen.

Ver­schach­te­lun­gen

Es kann nicht nur eine beliebige Anzahl an Gruppen innerhalb eines regulären Ausdrucks exis­tie­ren, es können auch beliebig viele Gruppen in­ein­an­der ge­schach­telt werden, um komplexe Be­zie­hun­gen zwischen einfachen Zeichen und Son­der­zei­chen auch ohne unnötig lange Zei­chen­ket­ten aus­zu­drü­cken. Ein Beispiel hierfür ist folgendes Regex-Muster, das die vier Au­to­mo­del­le „VW Golf“, „VW Polo“, „Fiat Punto“ oder „Fiat Panda“ als mögliche Treffer hat:

(VW (Golf|Polo)|Fiat (Punto|Panda))

Wort­gren­zen

Sollen Wort­gren­zen, also der Anfang bzw. das Ende einer al­pha­nu­me­ri­schen Sequenz, bei der Anwendung eines regulären Ausdrucks be­rück­sich­tigt werden, muss man dies per Me­ta­zei­chen spe­zi­fi­zie­ren. Viele Sprachen verwenden hierfür die Kom­bi­na­ti­on „\b“, die wahlweise dem Such­mus­ter vor­an­ge­stellt, an­ge­han­gen oder vor­an­ge­stellt und an­ge­han­gen werden kann.

Erstere Variante schreibt vor, dass die Such­se­quenz am Wort­an­fang steht:

\bein

Eine Über­ein­stim­mung für diesen regulären Ausdruck bietet zum Beispiel das Wort „einfach“. Das Wort „Bein“ ist hingegen als Treffer aus­ge­schlos­sen, da den gesuchten Zeichen der Buchstabe „B“ vor­an­steht. Um den Spieß um­zu­dre­hen, nutzen Sie Variante Nummer Zwei und hängen die Son­der­zei­chen an:

ein\b

Mit der dritten Option machen Sie schließ­lich beide Wort­gren­zen zur Vor­aus­set­zung, was im Fall des ver­wen­de­ten Beispiels den un­be­stimm­ten Artikel (bzw. das Pronomen/Zahlwort/Adverb) „ein“ zum einzigen möglichen Treffer macht:

\bein\b

Me­ta­be­deu­tung von Son­der­zei­chen aufheben

Im vor­an­ste­hen­den Abschnitt hat der Backslash dafür gesorgt, dass das nach­fol­gen­de „b“ nicht als Buchstabe, sondern als Me­ta­zei­chen gewertet wird. Kom­bi­niert man ihn mit Zeichen, die stan­dard­mä­ßig zu den syn­tak­ti­schen Regex-Son­der­zei­chen zählen, hat er genau die ent­ge­gen­ge­setz­te Wirkung – das Zeichen wird als ge­wöhn­li­cher Literal behandelt. Dank dieser Mög­lich­keit können Sie mit einem regulären Ausdruck auch pro­blem­los nach einem konkreten Datum suchen:

11\.10\.2019

Das Datum „11.10.2019“ stimmt in diesem Fall als einzige Zei­chen­ket­te mit den ge­for­der­ten Such­kri­te­ri­en überein. Ohne den gesetzten Backslash würden die beiden Punkte als Platz­hal­ter für ein be­lie­bi­ges Zeichen gewertet werden, weshalb dann auch Resultate wie „1101092019“ oder „11a10b2019“ möglich wären.

Gierige reguläre Ausdrücke „ent­schär­fen“

Der Einsatz von Quantoren („?“, „+“, „*“, „{}“) sorgt stan­dard­mä­ßig dafür, dass ein Ausdruck „gierig“ ist und nach der größt­mög­li­chen Über­ein­stim­mung sucht. Da dieses Verhalten aber nicht immer gewünscht ist, lassen sich Quantoren in einem regulären Ausdruck so spe­zi­fi­zie­ren, dass dessen „Gier“ ein­ge­dämmt wird. Deut­li­cher wird dieser Mo­di­fi­zie­rungs­pro­zess durch folgendes Beispiel:

A.*B

An­ge­wen­det auf die Zei­chen­fol­ge „ABCDEB“ würde dieser gierige Ausdruck die Suche nicht nach „AB“ stoppen, sondern die gesamte Zei­chen­fol­ge als Treffer erfassen. Soll die Suche hingegen bereits nach dem ersten ge­fun­de­nen „B“ abbrechen, bedarf es der an­ge­spro­che­nen Mo­di­fi­zie­rung. In vielen Sprachen (u.a. Perl, Tcl, HTML) wird Quantoren zu diesem Zweck ein Fra­ge­zei­chen nach­ge­stellt:

A.*?B

Al­ter­na­tiv lässt sich der ur­sprüng­li­che, gierige Ausdruck auch durch folgenden gleich­wer­ti­gen, „nicht-gierigen“ Ausdruck ersetzen, um zum gleichen Ergebnis zu kommen:

A[^B]*B
Hinweis

Die Ein­schrän­kung gieriger regulärer Ausdrücke macht die Ver­ar­bei­tung eines Such­mus­ters kom­pli­zier­ter und ist daher mit einer erhöhten Suchdauer verknüpft.

Zum Hauptmenü