Bücher online kostenlos Kostenlos Online Lesen
Die Programmiersprache Ruby (German Edition)

Die Programmiersprache Ruby (German Edition)

Titel: Die Programmiersprache Ruby (German Edition) Kostenlos Bücher Online Lesen
Autoren: David Flanagan , Yukihiro Matsumoto
Vom Netzwerk:
"rocks": Text, der für das dritte Untermuster passt
data[1,2] # => ["Ruby", "\t"]
data[1..3] # => ["Ruby", "\t", "rocks"]
data.values_at(1,3) # => ["Ruby", "rocks"]: nur ausgewählte Indizes
data.captures # => ["Ruby", "\t", "rocks"]: nur Untermuster
Regexp.last_match(3) # => "rocks": wie Regexp.last_match[3]
# Anfangs- und Endpositionen der Matches
data.begin(0) # => 0: Startindex des gesamten Matches
data.begin(2) # => 4: Startindex des zweiten Untermusters
data.end(2) # => 5: Endindex des zweiten Untermusters
data.offset(3) # => [5,10]: Anfang und Ende des dritten Untermusters
    Wenn in Ruby 1.9 ein Muster benannte Gruppen besitzt, kann ein für dieses Muster geholtes
MatchData
wie ein Hash angesprochen werden, wobei die Namen der Gruppen (als Strings oder Symbole) als Schlüssel dienen, zum Beispiel:
# Nur Ruby 1.9
pattern = /(?Ruby|Perl) (?\d(\.\d)+) (?rocks|sucks)!/
if (pattern =~ "Ruby 1.9.1 rocks!")
$~[:lang] # => "Ruby"
$~[:ver] # => "1.9.1"
$~["review"] # => "rocks"
$~.offset(:ver) # => [5,10] Start- und Endoffset der Versionsnummer
end
# Namen der Gruppen und ein Hash, die Gruppennamen auf Gruppennummern abbildet
pattern.names # => ["lang", "ver", "review"]
pattern.named_captures # => {"lang"=>[1],"ver"=>[2],"review"=>[3]}
    Neben dem Operator
=~
definieren die Klassen
Regexp
und
String
auch eine Methode
match
. Diese Methode arbeitet wie der Match-Operator, nur dass nicht der Index zurückgeliefert wird, an dem ein Match gefunden wurde, sondern das
MatchData
-Objekt (oder
nil
, wenn kein passender Text vorhanden war). Verwenden Sie es zum Beispiel so:
if data = pattern.match(text) # oder: data = text.match(pattern)
handle_match(data)
end
    ----
    Benannte Gruppen und lokale Variablen
    Wenn in Ruby 1.9 ein literaler regulärer Ausdruck mit benannten Gruppen auf der linken Seite des Operators
=~
auftaucht, werden die Namen der Gruppen als lokale Variablen genutzt und der passende Text diesen Variablen zugewiesen. Wenn der Match nicht passt, erhalten die Variablen den Wert
nil
. Hier sehen Sie ein Beispiel:
# Nur Ruby 1.9
if /(?\w+) (?\d+\.(\d+)+) (?\w+)/ =~ "Ruby 1.9 rules!"
lang # => "Ruby"
ver # => "1.9"
review # => "rules"
end
    Das ist ein recht wundersames Verhalten, das aber nur eintritt, wenn ein regulärer Ausdruck als Literal in Ihrem Code steht. Wenn ein Muster in einer Variablen oder Konstanten gespeichert ist oder von einer Methode zurückgegeben wird, oder wenn das Muster auf der rechten Seite steht, wird diese spezielle Variablenzuweisung durch den Operator
=~
nicht vorgenommen. Wird Ruby mit der Option
-w
aufgerufen, erscheint eine Warnung, wenn der Operator
=~
eine schon definierte Variable überschreibt.
    ----
    In Ruby 1.9 können Sie auch einen Block mit einem Aufruf von
match
verbinden. Wenn kein Match gefunden wird, wird der Block ignoriert und
match
liefert
nil
zurück. Wenn ein Match passte, wird aber das
MatchData
-Objekt dem Block übergeben und die
match
-Methode liefert zurück, was immer der Block liefert. Daher kann in Ruby 1.9 dieser Code prägnanter geschrieben werden:
pattern.match(text) {|data| handle_match(data) }
    Eine andere Änderung in Ruby 1.9 ist, dass die
match
-Methoden optional einen Integer-Wert als zweites Argument übernehmen können, durch den die Startposition der Suche angegeben wird.
    9.2.4.1 Globale Variablen für Match-Daten
    Ruby orientiert sich an der Perl-Syntax für reguläre Ausdrücke und setzt – ebenfalls wie Perl – spezielle globale Variablen nach jedem Match. Wenn Sie Perl-Programmierer sind, werden Sie diese speziellen Variablen sehr nützlich finden. Wenn Sie kein Perl-Programmierer sind, werden sie für Sie eventuell unlesbar sein! Tabelle 9.3 fasst diese Variablen zusammen. Die in der zweiten Spalte aufgeführten Variablen sind Aliase, die zur Verfügung stehen, wenn Sie
require 'English'
nutzen.
    Tabelle 9.3 Spezielle globale Variablen bei Verwendung regulärer Ausdrücke
    Global
Englisch
Alternative
$~
$LAST_MATCH_INFO
Regexp.last_match
$&
$MATCH
Regexp.last_match[0]
$`
$PREMATCH
Regexp.last_match.pre_match
$'
$POSTMATCH
Regexp.last_match.post_match
$1
-
Regexp.last_match[1]
$2
, etc.
-
Regexp.last_match[2]
usw.
$+
$LAST_PAREN_MATCH
Regexp.last_match[-1]
    $~
ist die wichtigste der in Tabelle 9.3 aufgeführten Variablen. Alle anderen sind daraus abgeleitet. Wenn Sie
$~
auf ein
MatchData
-Objekt setzen, ändern sich auch die Werte der anderen speziellen globalen Variablen. Diese sind nur lesbar und

Weitere Kostenlose Bücher