Suchmuster

Reguläre Ausdrücke?

Mit regulären ausdrücke beschreibt man suchmuster. Wozu das gut sein kann, sieht man am schnellsten durch ein relativ einfaches beispiel. Angenommen wir schreiben einen text und vergessen dabei gelegentlich den satzanfang groß zu schreiben. Dies wollen wir durch ein NEdit Skript automatisch korrigieren lassen. Leicht abgekürzt lautet der entscheidende teil dieses skripts

  1. start= search("[\\.!:\\?] \\l+", $cursor, "backward", "regex")
  2. if ($cursor == $search_end)
  3. { Korrigiere erstes Wort und gebe ein Leerzeichen ein }
  4. else insert_string(" ")

Die erste zeile sucht von der cursor position aus zurück nach dem regular expression oder muster (pattern) [\.!:\?] \l+ . (Die zusätzlichen backslashes sind nur wegen der C spracheigenheit in zeichenketten notwendig.) Das muster besteht aus einer zeichenkette, die mit einem zeichen, das in den rechteckigen klammern gelistet ist, also mit einem punkt, ausrufezeichen, doppelpunkt oder fragezeichen, beginnt. (Backslash vor punkt und fragezeichen bedeutet, lese die zeichen wörtlich, sonst hätten diese eine andere bedeutung.) Danach folgt ein leerzeichen und schließlich eine variable(!) anzahl von buchstaben (\l steht für buchstaben und + bedeutet mindestens einen und möglichst viele). Die ausführung des skripts wird and die leertaste gebunden.

Also, wir schreiben z.B. Satzende. hallo und drücken die leertaste. Dann wir das skript ausgeführt und findet die zeichenkette . hallo. Die endposition der kette stimmt mit der cursor position überein, also wird der if-block ausgeführt, hallo korrigiert (das ist kein problem, da wir den anfang der kette in der variablen start haben) und anschließend wird ein leerzeichen eingegeben. Wir schreiben weiter Satzende. Hallo Welt.  und drücken die leertaste. Das skript findet die zeichenkette . Hallo und nicht etwa . Hallo Welt, denn nach Hallo kommt ein Leerzeichen und das ist kein Buchstabe. Diesmal stimmt die cursor position nicht mit dem ende der zeichenkette überein, da wir uns nicht am satzanfang befinden, der if-block wird nicht ausgeführt und es wird nur ein leerzeichen hinter Welt. eingefügt.

Ohne reguläre ausdrücke könnte man selbst dieses einfache beispiel nur umständlich realisieren und komplexere aufgaben gar nicht. Die anwendungen sind so zahlreich, das ich mir editoren, die reguläre ausdrücke nicht ausreichend unterstützen, nicht mehr anschaue. NEdit benutzt reguläre ausdrücke auch zum Syntax Highlighting. Hierbei werden nicht nur einzelne schlüsselwörter wie if oder else farblich markiert, sondern es ist möglich geklammerte ausdrücke zu kennzeichnen und innerhalb dieser ausdrücke dann wieder befehle oder schlüsselwörter zu markieren.
Speziell bei LaTeX dateien führt dies dazu, daß man keine klammern mehr vergißt, weil man direkt an der färbung sieht, hier stimmt etwas nicht. Damit schließt man schon beim schreiben einen häufigen und unangenehmen fehler aus, denn bei fehlenden klammern liefert der TeX compiler leider meist keine hilfreichen fehlermeldungen.