Reguläre Ausdrücke
Reguläre Ausdrücke sind eine Möglichkeit, um in einer Programmiersprache professionelle Suchen (/ Ersetzen) zu implementieren. Die Programmiersprache, in die Reguläre Ausdrücke wohl am besten integriert sind ist Perl.
Reguläre Ausdrücke werden in der Form /Suchausdruck/ geschrieben. In Perl gibt es den Bindet-Operator, der prüft ob ein Regulärer Ausdruck auf einen String passt. Beispiel:
Ein einfaches Beipspiel
Dieses Programm ließt solange Zeilen vom Terminal bis das Datei-Ende Zeichen (oft [Strg+D]) gedrückt wurde. Dann geht es alle Zeilen durch und prüft ob eine davon die Zeichenkette Morgen enthält. Wenn dies so ist gibt es Guten Morgen und einen Zeilenumbruch aus. Der reguläre Ausdruck ist hier /Morgen/ und der Bindet-Operator sieht so aus: =~. Aber dieses Beispiel zeigt noch lange nicht, wie mächtig Reguläre Ausdrücke sind. Es gibt spezielle Zeichen, die für ein oder mehrere beliebige Zeichen stehen. Um z.B. Mark zu finden, wobei aber das a jedes beliebige Zeichen sein darf (wenn man auch Murk, oder Mirk finden will), dann schreibt man:
/M.rk/
Hierbei steht der Punkt für ein beliebiges Zeichen, außer einem Zeilenumbruch. Was wenn man nun aber statt einem beliebigen Zeichen beliebig viele Solcher finden will? Wenn man z.B. auch Meark oder Maurk finden will? Falls mindestens ein Zeichen vorkommen soll, schreibt man:
/M.+rk/
Der Punkt (ein beliebieges Zeichen) in Verbindung mit dem Plus (das Zeichen vor dem Plus muss mindestens 1 mal, darf aber auch öfter vorkommen) steht für ein Reihe, die aus mindestens einem beliebigen Zeichen besteht, aber auch aus mehreren bestehen darf. Jetzt gibt es noch das * Zeichen, welches für eine beliebige Anzahl von Zeichen (auch 0 Zeichen) steht. Wenn man z.B. einen String finden möchte der mit port endet, und davor beliebig viele beliebige Zeichen enthält, dann schreibt man:
/.*port/
Dieser Ausdruck bindet z.B. auf Airport, Berliner Airport, … Nun gibt es noch eine dritte Möglichkeit, die Anzahl der Wiederholungen eines Zeichens festzulegen: Der {x,y}-Operator. Mit ihm kann man die genaue Anzahl von Wiederholungen {Anzahl} die Anzahl der minimalen Wiederholungen {x,} und die Menge der maximalen sowie minimalen Anzahl der Wiederholungen {minimal,maximal} festlegen. So könnte man z.b. sagen zwischen M und R müssen genau 5 beliebige Zeichen sein:
/M.{5}r/
Nur um eventuellen Verwirrungen den Boden zu nehmen: Diese ganzen Operatoren können auch auf normale Buchstaben oder Zahlen angewendet werden, es ist nicht nötig den Punkt zu benutzen. Übrigens: Wenn man ein Zeichen, welches in einem regulären Ausdruck ein Operator ist normal schreiben will (mit . meint man auch. und nicht ein beliebiges Zeichen), dann kann man dies tun indem man den \ davor setzt!
Der nächste Abschnitt in diesem Tutorial über Reguläre Ausdrücke sind die Zeichenklassen. Schön und gut, bis jetzt können wir dem Computer sagen, dass ein bestimmtes oder ein beliebiges Zeichen so und so oft vorzukommen hat, aber was wenn man nun will, dass das Zeichen kleingeschrieben sein muss? Oder es sind nur Konsonantden erlaubt? Es könnten aber auch nur – und _ erlaubt sein. Sie sehen: Hier fehlt eindeutig eine Möglichkeit um zu bestimmen, welche Zeichen gesucht sind. Diese Möglichkeit ist die Zeichenklassen. Zeichenklassen schreibt man immer in eckigen Klammern []. Eine Zeichenklasse, die nur das a und c erlaubt würde wie folgt aussehen: [ac]. In einem regulären Ausdruck wird das dann einfach für den Punkt eingesetzt:
/M[ac]{5}r/
Dies ist der selbe reguläre Ausdruck wie oben, nur dass jetzt als “beliebige” Zeichen nur noch a und c gelten. Wenn man aber nun das ganze kleine Alphabet zulassen will dann hat man ziemlich viel zu schreiben. Gott sei dank sind Programmierer schreibfaul und deswegen gibt es den “-”-Operator. Wenn man [a-z] schreibt enthält die Zeichenklassen das ganze kleine Alphabet. Dies hat aber eine (negative) Nebenwirkung: Wenn man einfach – in einer Zeichenklasse schreibt und es als Zeichen und nicht als Operator meint, dann wird das nicht funktionieren. Deswegen muss man – ans Ende der Zeichenklasse schreiben [a-z-] dann klappt es. Mann kann statt 1-9 auch \d schreiben. Und statt a-zA-z_- auch \w.
Zeichenklassen lassen sich auch negieren, dafür notiert man am Anfang der Zeichenklasse ^. Dadurch wird die gesamte Zeichenklasse umgekehrt. [^a-z] lässt alles außer Kleinbuchstaben zu.
Das war es ersteinmal. In diesem Tutorial bin ich auf viele Sachen noch nicht eingegangen, aber ich habe vor noch einen zweiten Teil zu schreiben!





Kommentare
(verstecken) RSSGib deine Meinung ab!