Ein MatchData-Objekt speichert die Resultate, die der Vergleich eines regulären Ausdrucks mit einem String geliefert hat.
Ruby bietet zwei gleichwertige Schreibweisen für reguläre Ausdrücke:
opa = "Opa fährt einen Porsche 944 Turbo"
# OO-Schreibweise
rxp = Regexp.new('Porsche') #-> /Porsche/
md = rxp.match(opa) #-> <MatchData:...>
# kompakte Schreibweise
/Porsche/.match(opa) #-> <MatchData:...>
/Ferrari/.match(opa) #-> nil, nicht gefunden
Reguläre Ausdrücke werden richtig interessant, wenn man den gesuchten Begriff nicht Buchstabe für Buchstabe beschreiben kann. In diesem Fall können mit besonderen Anweisungen Zeichenklassen eingesetzt sowie deren Gruppierungen und Wiederholungen bestimmt werden.
Ruby unterstützt die auch aus Perl und Python bekannten
Musterbeschreibungen. \w ist ein "`word"'-Zeichen,
also Buchstabe oder Ziffer, + bedeutet "`mindestens eins"',
insgesamt kann man das folgende Muster als "`Porsche undDasNächsteWort"' lesen.
md = /(Porsche) (\w+)/.match(opa) md[0] #-> "Porsche 944" alles md[1] #-> "Porsche" erste Klammer md[2] #-> "944" zweite Klammer md.pre_match #-> "Opa fährt einen " vorher md.post_match #-> " Turbo" nachher
Die Ergebnisse des Vergleichs werden in einem MatchData-Objekt
gespeichert. pre_match und post_match liefern den
Teil vor und nach dem gefundenen String.
md[0] liefert den gesamten passenden Teilstring zurück.
Wenn im regulären Ausdruck Gruppierungen durch ( und )
gesetzt wurden, enthalten md[1], md[2] usw. die entsprechenden
Gruppen. Gruppierungen, die mit (?: beginnen,
werden nicht in das MatchData-Array übernommen.
Werden Vergleiche mit regulären Ausdrücken ausgeführt,
modifiziert Ruby einige Systemvariablen,
mit denen "`interessante "' Teile des Strings ähnlich
wie in Perl referenziert werden können.
$& #-> alles: "Porsche 944" $1 #-> erste Klammer: "Porsche" $2 #-> zweite Klammer: "944" $` #-> vorher: "Opa fährt einen " $' #-> nachher: " Turbo"