Die Programmiersprache Ruby (German Edition)
zu
Array.pack
und
String.unpack
. Hier sehen Sie ein paar einfache Beispiele:
a = [1,2,3,4,5,6,7,8,9,10] # Ein Array mit zehn Integer-Zahlen
b = a.pack('i10') # Packe zehn 4-Byte-Integer (i) in den binären String b
c = b.unpack('i*') # Dekodiere alle (*) 4-Byte-Integer aus b
c == a # => true
m = 'Hallo Welt!' # Eine zu kodierende Nachricht
data = [m.size, m] # Erst die Länge, dann die Bytes
template = 'Sa*' # Unsigned Short, dann beliebig viele ASCII-Zeichen
b = data.pack(template) # => "\v\000Hallo Welt!"
b.unpack(template) # => [11, "Hallo Welt!"]
9.1.3 Strings und Kodierung
Die
String
-Methoden
encoding
,
encode
,
encode!
und
force_encoding
sowie die Klasse
Encoding
wurden in „3.2.6 String-Kodierungen und Multibyte-Zeichen“ beschrieben. Sie können diesen Abschnitt noch einmal lesen, wenn Sie Programme schreiben wollen, die Unicode oder Multibyte-Zeichenkodierungen nutzen.
9.2 Reguläre Ausdrücke
Ein regulärer Ausdruck (auch bekannt als Regexp oder Regex) beschreibt ein Textmuster. Rubys Klasse
Regexp
[ 32 ] implementiert reguläre Ausdrücke, und sowohl
Regexp
als auch
String
definieren Methoden und Operatoren zum Mustervergleich. Wie die meisten Sprachen mit Unterstützung regulärer Ausdrücke orientiert sich die
Regexp
-Syntax von Ruby stark an der Syntax von Perl 5 (sie ist aber nicht gleich).
9.2.1 Regexp-Literale
Literale von regulären Ausdrücken werden durch Schrägstriche begrenzt:
/Ruby?/ # Passt zum Text "Rub", gefolgt von einem optionalen "y"
Der abschließende Schrägstrich ist kein echter Begrenzer, da ein Regexp-Literal einen oder mehrere Modifikatorzeichen enthalten kann, die zusätzliche Informationen dazu liefern, wie der Musterabgleich durchzuführen ist, zum Beispiel:
/ruby?/i # Ignoriere Groß- und Kleinschreibung: passt zu "ruby" oder "RUB" etc.
/./mu # Passt zu Unicode-Zeichen im Multiline-Modus
Die zulässigen Modifikatorzeichen werden in Tabelle 9.1 aufgeführt.
Tabelle 9.1 Modifikatorzeichen für reguläre Ausdrücke
Modifikator
Beschreibung
i
Ignoriere Groß- und Kleinschreibung beim Vergleichen von Text.
m
Das Muster wird mit mehrzeiligem Text verglichen, daher werden Zeilenumbrüche als normale Zeichen behandelt:
.
passt zu Zeilenumbrüchen.
x
Erweiterte Syntax: Leerraum und Kommentare in Regexp erlaubt.
o
Führe
#{}
-Ausdrücke nur einmal aus – nämlich beim ersten Mal, wenn das Regexp-Literal ausgewertet wird.
u
,
e
,
s
,
n
Interpretiere die Regexp als Unicode (UTF-8), EUC, SJIS oder ASCII. Wenn keiner dieser Modifikatoren angegeben wird, wird beim regulären Ausdruck die Quellkodierung genutzt.
Wie String-Literale, die durch
%Q
begrenzt sind, ermöglicht Ruby Ihnen, Ihre regulären Ausdrücke mit
%r
zu beginnen – gefolgt von einem Begrenzer Ihrer Wahl. Das ist nützlich, wenn das zu beschreibende Muster eine Reihe von Schrägstrichen enthält, die Sie nicht mit Escape-Zeichen versehen wollen:
%r|/| # Finde einen einzelnen Schrägstrich, kein Escape-Zeichen nötig.
%r[(.*)>]i # Auch bei dieser Syntax sind Modifikatorzeichen erlaubt.
In der Syntax für reguläre Ausdrücke haben die Zeichen
()
,
[]
,
{}
,
.
,
?
,
+
,
*
,
|
,
^
und
$
eine besondere Bedeutung. Wenn Sie ein Muster beschreiben wollen, das eines dieser Zeichen enthält, nutzen Sie einen Backslash als Escape-Zeichen. Wenn Sie ein Muster beschreiben wollen, das einen Backslash enthält, geben Sie ihn doppelt an:
/\(\)/ # Findet offene und schließende Klammern
/\\/ # Findet einen einzelnen Backslash
Regexp-Literale verhalten sich wie String-Literale in doppelten Anführungszeichen und können Escape-Zeichen wie
\n
,
\t
und (in Ruby 1.9)
\u
enthalten (in Tabelle 3.1 in Kapitel 3 finden Sie eine vollständige Liste mit Escape-Zeichen):
money = /[$\u20AC\u{a3}\u{a5}]/ # Finde Dollar-, Euro-, Pfund- oder Yen-Zeichen
Wie String-Literale in doppelten Anführungszeichen ermöglichen es Regexp-Literale ebenfalls, bestimmte Ruby-Ausdrücke mit der Syntax
#{}
auswerten zu lassen:
prefix = ","
/#{prefix}\t/ # Findet ein Komma, gefolgt von einem ASCII-Tab-Zeichen
Beachten Sie, dass die Auswertung sehr früh durchgeführt wird – noch bevor der Inhalt des regulären Ausdrucks geparst wird. Das bedeutet, dass jedes spezielle Zeichen im ausgewerteten Ausdruck Teil des regulären Ausdrucks wird. Die Auswertung wird jedes Mal neu durchgeführt, wenn ein Regexp-Literal untersucht wird. Wenn Sie den Modifikator
o
nutzen, wird diese Auswertung allerdings nur einmal beim ersten Parsen des Codes durchgeführt. Das
Weitere Kostenlose Bücher