# Reguläre Ausdrücke

Ein regulärer Ausdruck ist nichts anderes als ein Suchmuster, um übereinstimmende Muster in einer Eingabe zu finden.

Einfache reguläre Ausdrücke sind uns sicher schon begegnet, ohne es bewusst wahr genommen zu haben. Zum Beispiel bei der Suche nach einem Zeichenmuster `text` im Editor `vi` (mit `/text`).
Bleiben wir beim Beispiel des `vi` und schauen uns weitere Möglichkeiten regulärer Ausdrücke anhand eines Verses von Eugen Roth an:

`Übelkeit Du magst der Welt oft lange trotzen, Dann spürst du doch: es ist zum ---. Doch auch wenn deine Seele bricht, Beschmutze deinen Nächsten nicht!`

Aus irgendeinem Grund möchten wir im Text nun "dein" durch "sein" ersetzen, im Kommandomodus des `vi` geben wir folgende Zeile ein

`:1,$s/dein/sein/g`

und erhalten:

`Übelkeit Du magst der Welt oft lange trotzen, Dann spürst du doch: es ist zum ---. Doch auch wenn seine Seele bricht, Beschmutze seinen Nächsten nicht!`

Jetzt stört uns plötzlich das Wort "doch" und wir möchten beide Auftreten entfernen, also geben wir

`:1,$s/[Dd]och//g`

ein und erzielen:

`Übelkeit Du magst der Welt oft lange trotzen, Dann spürst du : es ist zum ---. auch wenn seine Seele bricht, Beschmutze seinen Nächsten nicht!`

Wozu man das braucht? Naja, stellt Euch vor, auch Ihr schreibt eine Einführung über irgendetwas. Und auch Ihr veröffentlicht das Ganze in den zwei Formaten HTML und Postscript. Ihr schreibt auch noch in Deutsch und müsst im LaTeX jedes 'ü' durch '"u' ausdrücken, jeden 'ö' durch '"s' usw. Vielleicht macht Ihr Euch die Arbeit, im HTML die Umlaute durch den Unicode auszudrücken... Dann könntet Ihr alles per Hand anpassen, oder das Ganze durch ein paar wenige Zeilen regulärer Ausdrücke erledigen.

Bevor wir uns den einzelnen Werkzeugen zuwenden, sollen alle regulären Ausdrücke tabellarisch zusammen gefasst werden:

Zeichen | Bedeutung | Beispiel
`^` | Muster am Zeilenanfang suchen | `/^beginnt/`
`$` | Muster am Zeilenende suchen | `/endet hier$/`
`*` | Beliebig viele Auftreten des vorangegangenen Zeichens | `/ *schon/`
`.` | Genau ein beliebiges Zeichen | `/.och/`
`[]` | Eines der Zeichen | `/[Dd]och/`
`[x-y]` | Eines der Zeichen aus dem Bereich | `/[A-X]och/`
`[^]` | Keines der Zeichen | `/[^ln]och/`
`\` | Sperrt die Sonderbedeutung des nachfolgenden Zeichens | `/x\$\>y/`
`\<` | Muster am Wortanfang suchen | `/\<doch/`
`\>` | Muster am Wortende suchen | `/ung\>/`
`\(..)\` | Eingeschlossenes Muster vormerken; auf dieses kann später über `\1` zugegriffen werden. Bis zu neun Muster können auf diese Weise gespeichert werden (Beispiel). | `/\(aff\)ig \1enstark/`
`x\{m\}` | `m`-faches Auftreten des Zeichens `x` | `/s\{3\}/`
`x\{m,n\}` | mindestens `m`-, maximal `n`-maliges Auftreten des Zeichens `x` | `/+\{5,8\}/`

Zwar vermag nicht jedes der nachstehenden Tools mit jedem der Ausdrücke etwas anzufangen, aber die meisten Mechnismen lassen sich schon in einem Pager wie `less` nach vollziehen.

Beispiel zu `\(..\)`

In einem Leserbrief an eine beliebige Zeitung verwenden wir mehrfach die Redewendung "Herren und Damen". Später wird uns bewusst, dass wir die guten Manieren etwas vernachlässigt hatten und wollen die Ansprache nun in "Damen und Herren" ändern:

`Meine Herren und Damen! ... bitte ich die Herren und Damen, sich mit den Mechanismen der regulären Ausdrücke vertraut zu machen. ... Ich danke Ihnen, meine Herren und Damen!`

Im `vi` erledigt eine einzige Zeile die Arbeit:

`:1,$s/\(Herren\) \(und\) \(Damen\)/\3 \2 \1/g`

Die drei uns interessierenden Muster merken wir uns vor, und greifen während der Ersetzung in umgekehrter Reihenfolge auf diese zu.

`Meine Damen und Herren! ... bitte ich die Damen und Herren, sich mit den Mechanismen der regulären Ausdrücke vertraut zu machen. ... Ich danke Ihnen, meine Damen und Herren!`