4.7 Reguläre Ausdrücke 

Muster
Reguläre Ausdrücke oder kurz Regex sind Muster, um in Zeichenketten nach Entsprechungen zu suchen. Jedes Zeichen innerhalb eines Musters hat eine bestimmte Bedeutung. Reguläre Ausdrücke werden eingesetzt, um zu vergleichen (zum Beispiel, um zu prüfen, ob eine bestimmte Zeichenkette innerhalb einer anderen vorkommt), um zu suchen (zum Beispiel die Position eines Zeichens innerhalb einer Zeichenkette) und um ggf. das gefundene zu ersetzen.
Syntax von Regulären Ausdrücken 

Auch Reguläre Ausdrücke sind, wie alles in Ruby, Objekte. Ein Regulärer Ausdruck ist eine Instanz der Klasse Regexp und kann über den Aufruf der Klassenmethoden Regexp.compile oder Regexp.new (Synonym von compile), die einen String oder einen Regulären Ausdruck als Parameter erwarten, erzeugt werden. Oder Sie nutzen eine der Kurzschreibweisen /Regex/ oder %r(Regex):
>> Regexp.compile("buch") => /buch/ >> Regexp.new(/lampe/) => /lampe/ >> %r(tisch) => /tisch/ >> /stuhl/.class => Regexp
Darüber hinaus stehen in Regulären Ausdrücken Symbole und Abkürzungen zur Verfügung, von denen wir auch hier nur die am meistbenutzen auflisten:
Symbol/Abkürzung | Beschreibung |
^ | Anfang einer Zeile oder Zeichenkette | $ | Ende einer Zeile oder Zeichenkette | . | ein beliebiges Zeichen (neue Zeile nur im Mehrzeilenmodus) | \ w | ein beliebiges alphanumerisches Zeichen und der Unterstrich | \ W | ein beliebiges Zeichen, das nicht alphanumerisch und auch kein Unterstrich ist | \ s | ein Leerraum (Whitespace) | \ S | ein Zeichen, das kein Leerraum (Whitespace) ist | \ d | eine beliebige ganze Zahl | \ D | keine Ziffer | \ A | Anfang einer Zeichenkette | \ Z | Ende einer Zeichenkette oder Ende einer Zeile | \ z | Ende einer Zeichenkette | \ b | Wortgrenze (außerhalb von Bereichsangaben) | \ B | keine Wortgrenze | \ b | Backspace (innerhalb von Bereichsangaben) | [] | Bereichsangabe | * | null oder mehrmalige Wiederholung des vorhergehenden Ausdrucks | + | ein- oder mehrmalige Wiederholung des vorhergehenden Ausdrucks | {anz} | genau anz-maliges Vorkommen des vorhergehenden Ausdrucks | {min,max} | zwischen min- und max-maligem Vorkommen des vorhergehenden Ausdrucks | {min,} | mindestens min-maliges Vorkommen des vorhergehenden Ausdrucks | {,max} | maximal max-maliges Vorkommen des vorhergehenden Ausdrucks | ? | ein- oder kein-maliges Vorkommen des vorhergehenden Ausdrucks | () | Gruppierung von Ausdrücken | x|y | passt auf x oder y (/me(i|y)er/ findet meier und meyer) |
Tabelle Reguläre Ausdrücke-Symbole und Abkürzungen
Modifier
Es ist auch möglich, direkt hinter einen Regex einen sog. Modifier, der die Arbeit der Mustersuche beeinflusst, zu setzen. Modifier bestehen aus einem Buchstaben und sind kombinierbar. Zum Beispiel findet das Muster /buch/i sowohl die Zeichenkette buch als auch Buch . Wir haben nachfolgend die gebräuchlichsten aufgelistet:
Modifier | Beschreibung |
i | ignoriert Groß- und Kleinschreibung im Regulären Ausdruck(case insensitive search). |
o | liest den Regulären Ausdruck nur einmal(compile pattern once). |
m | Mehrzeilenmodus(multiple lines) |
x | erweiterter Regulärer Ausdruck(extended regular expression) |
Tabelle Reguläre Ausdrücke-Modifier
Maskierung
Wenn Sie mit Hilfe eines Regulären Ausdrucks nach einem Zeichen suchen möchten, das innerhalb eines Regulären Ausdrucks eine eigene Bedeutung hat, müssen Sie das Zeichen mit einem Backslash maskieren. Zum Beispiel steht der Punkt innerhalb eines Regex für ein beliebiges Zeichen. Wenn Sie aber nach einem Punkt suchen möchten, könnten Sie folgenden Regulären Ausdruck formulieren:
muster = /\./
Anwendungsbeispiele aus der Praxis 

Reguläre Ausdrücke werden für drei Anwendungsfälle benutzt:
- Vergleichen,
um zu prüfen, ob eine bestimmte Zeichenkette in einer anderen vorkommt, oder um Usereingaben, wie zum Beispiel Datumseingaben oder E-Mail-Adressen, auf ein bestimmtes Format zu überprüfen. - Suchen,
um zum Beispiel die Position eines bestimmten Zeichens in einer Zeichenkette zu ermitteln oder um innerhalb eines Arrays nach einem bestimmten Inhalt zu suchen. - Suchen und ersetzen,
um eine bestimmte Zeichenkette innerhalb einer anderen zu ersetzen.
Vergleichen
Um zu prüfen, ob es sich bei einer Zeichenkette um eine fünf-stellige Ziffernfolge handelt, zum Beispiel, ob eine Postleitzahl korrekt eingegeben wurde, können Sie folgenden Regulären Ausdruck definieren:
muster = /^\d{5}$/ string = "40211" if string =~ muster puts "korrekt" else puts "nicht korrekt" end
Einigen von Ihnen wird die Kurzschreibweise
string =~ muster
aus Perl bekannt sein. Sie prüft, ob string dem muster entspricht. Mit dem Aufruf der Methode match würde unser Beispiel so aussehen:
muster = /^\d{5}$/ string = "40211" if muster.match(string) puts "korrekt" else puts "nicht korrekt" end # => korrekt
Suchen
Reguläre Ausdrücke werden dann zum Suchen in einer Zeichenkette eingesetzt, wenn man zum Beispiel wissen möchte, an welcher Position ein bestimmtes Muster in einer Zeichenkette vorkommt. In unserem Beispiel möchten wir wissen, an welcher Position eine Ziffer vorkommt:
muster = /\d/ string="Preis: 2,5 EUR" puts string.index(muster) # => 7
Beispiel
Man kann aber auch mit Hilfe von Regulären Ausdrücken prüfen, ob zum Beispiel Elemente eines Arrays Ziffern enthalten:
muster = /\d/ array = ["Preis: 12", "Auto", "Farbe #227799"] puts array.grep(muster) # => Preis: 12 # => Farbe #227799
Tipp zum Suchen von Methoden |
Die Methode
grep(muster) wird sehr gerne benutzt, um in der Ruby-Konsole nach einem Methodennamen für ein Objekt zu suchen, von dem man nur ungefähr weiß, wie er heißen könnte. Zum Beispiel suchen wir nach dem Methodennamen, um einen String in Großbuchstaben umzuwandeln. Wir wissen noch, dass die Methode im Namen
case enthält, aber wie genau sie heißt, wissen wir nicht. Dann können wir in der Ruby-Konsole folgendes eingeben:
>> "beispiel".methods.sort.grep(/case/) => ["casecmp", "downcase", "downcase!", "swapcase", "swapcase!", "upcase", "upcase!" |
Suchen und Ersetzen
Ein Anwendungsfall für das Suchen und Ersetzen innerhalb von Zeichenketten wäre zum Beispiel das Ersetzen eines Trennzeichens in einem Betrag:
muster = /^\d{5}$/ string = "2,456" puts string.gsub(/,/,".") # => 2.456
oder das Vertauschen von Vor- und Nachname:
muster = /(\w+) (\w+)/ string= "Bohr Dominik" puts string.gsub(muster,'\2, \1') # => Dominik, Bohr
Mit den Methoden sub und gsub der Klasse String, die in unserem Beispiel zum Einsatz kamen, können Sie Ersetzungen in Zeichenketten vornehmen.
sub
Die Methode sub ersetzt das erste Vorkommen eines Suchmusters mit dem gegebenen Ersetzungsstring oder mit dem Ergebnis des gegebenen Blocks:
>> s1 = "Messer, Messer und Gabel" => "Messer, Messer und Gabel" >> s1.sub(/Messer/, "Loeffel") => "Loeffel, Messer und Gabel"
Das Suchmuster ist normalerweise ein Regulärer Ausdruck. Ist das Suchmuster ein String, werden die Abkürzungen der Regulären Ausdrücke mit ihren Sonderbedeutungen nicht mehr als diese erkannt. Der Reguläre Ausdruck /\d/ würde nach einer Ziffer in der Zeichenkette suchen, der String '\d' sucht nach einem Backslash gefolgt von einem d.
gsub
Die Methode gsub funktioniert genauso wie die Methode sub, mit dem Unterschied, dass gsub (global substitution) alle Übereinstimmungen mit dem Suchmuster ersetzt und nicht nur die erste:
>> s2 = "Messer, Messer und Gabel" => "Messer, Messer und Gabel" >> s2.gsub(/Messer/, "Loeffel") => "Loeffel, Loeffel und Gabel"
Sowohl sub als auch gsub verfügen über äquivalente Methoden sub! und gsub!, die das Objekt, auf das die Methode angewendet wird, verändern:
>> s = "Das Bild haengt schief" => "Das Bild haengt schief" >> s.gsub!(/schief/, "nicht schief") => "Das Bild haengt nicht schief" >> s => "Das Bild haengt nicht schief"
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.