Die Programmiersprache Ruby (German Edition)
nach dem Wort »ruby« und fügt HTML-Bold-Tags drumherum ein, wobei die Schreibweise des Worts beibehalten wird:
text.gsub(/\bruby\b/i, '\0')
Beachten Sie, dass Sie bei Verwendung eines Ersatz-Strings in doppelten Anführungszeichen das Backslash-Zeichen doppelt eingeben müssen.
Sie mögen vielleicht versuchen, das Gleiche mithilfe der normalen Verarbeitung von Strings in doppelten Anführungszeichen zu erreichen:
text.gsub(/\bruby\b/i, "#{$&}")
Das funktioniert allerdings nicht, da das Literal in diesem Fall zuerst verarbeitet und erst dann dem
gsub
übergeben wird. Das wiederum erfolgt natürlich, bevor das Muster gefunden werden kann, daher sind Variablen wie
$&
nicht definiert oder enthalten Werte aus einem vorherigen Vergleich.
In Ruby 1.9 können Sie sich auf benannte Gruppen mithilfe der Backreference-Syntax
\k
beziehen:
# Anführungszeichenpaare aus einem String entfernen
re = /(?['"])(?[^'"]*)\k/
puts "Das sind 'Anführungszeichen'".gsub(re, '\k')
Ersatz-Strings können sich auch auf anderen Text als den aus den passenden Gruppen beziehen. Mit
\&
,
\`
,
\'
und
\+
haben Sie die Möglichkeit, auf die Werte von
$&
,
$`
,
$'
und
$+
zuzugreifen.
Statt einen statischen Ersatz-String zu nutzen, können die Methoden zum Suchen und Ersetzen auch mit einem Codeblock aufgerufen werden, der den Ersatz-String dynamisch ermittelt. Das Argument für den Block ist der Text, der dem Muster entspricht:
# Konsistente Groß- und Kleinschreibung für die Namen der Programmiersprachen
text = "RUBY Java perl PyThOn" # Zu verändernder Text
lang = /ruby|java|perl|python/i # Muster
text.gsub!(lang) {|l| l.capitalize } # Groß-/Kleinschreibung korrigieren
Innerhalb des Codeblocks können Sie
$~
und die entsprechenden globalen Variablen nutzen, die weiter oben in Tabelle 9.3 aufgeführt wurden:
pattern = /(['"])([^\1]*)\1/ # String mit einfachen oder doppelten Anführungszeichen
text.gsub!(pattern) do
if ($1 == '"') # Bei doppelten Anführungszeichen
"'#$2'" # durch einfache ersetzen
else # Ansonsten bei einfachen Anführungszeichen
"\"#$2\"" # durch doppelte ersetzen
end
end
9.2.4.4 Kodierung regulärer Ausdrücke
In Ruby 1.9 haben
Regexp
-Objekte genau wie Strings eine
encoding
-Methode. Sie können die Kodierung eines regulären Ausdrucks explizit mit den Modifikatoren festlegen:
u
für UTF-8,
s
für SJIS,
e
für EUC-JP und
n
für keine Kodierung. Sie können sich auch explizit auf UTF-8 festlegen, indem Sie das Escape-Zeichen
\u
in den regulären Ausdruck mit aufnehmen. Wenn Sie keine Kodierung explizit angeben, wird die Quellkodierung verwendet. Aber wenn alle Zeichen einer Regexp ASCII sind, wird ASCII verwendet, selbst wenn die Quellkodierung eine Obermenge von ASCII ist.
Die Pattern-Matching-Operatoren in Ruby 1.9 lösen eine Exception aus, wenn Sie versuchen, ein Muster mit einem String zu vergleichen, beide aber unterschiedliche Kodierungen besitzen. Die Methode
fixed_encoding?
liefert
true
zurück, wenn
Regexp
eine andere Kodierung als ASCII besitzt. Wenn
fixed_encoding?
den Wert
false
liefert, kann dieses Muster auf sichere Weise bei Strings genutzt werden, deren Kodierung ASCII oder eine Obermenge davon ist.
9.3 Zahlen und Berechnungen
Kapitel 3 hat die verschiedenen
Numeric
-Subklassen in Ruby vorgestellt, erklärt, wie man numerische Literale schreibt, und die Ganzzahl- und Gleitkommaarithmetik in Ruby dokumentiert. Hier wollen wir darauf aufbauen und die numerischen APIs sowie andere mathematikbezogenen Klassen vorstellen.
9.3.1 Numerische Methoden
Numeric
und seine Subklassen definieren eine Reihe von nützlichen Prädikaten, um die Klasse einer Zahl zu bestimmen oder den Wert zu prüfen. Manche dieser Prädikate lassen sich nur mit
Float
-Werten nutzen, andere nur mit
Integer
-Werten:
# Allgemeine Prädikate
0.zero? # => true (ist diese Zahl null?)
1.0.zero? # => false
0.0.nonzero? # => nil (wie false)
1.nonzero? # => 1 (wie true)
1.integer? # => true
1.0.integer? # => false
1.scalar? # => false: keine komplexe Zahl. Ruby 1.9.
1.0.scalar? # => false: keine komplexe Zahl. Ruby 1.9.
Complex(1,2).scalar? # => true: komplexe Zahl, erfordert 'complex'
# Integer-Prädikate
0.even? # => true (Ruby 1.9)
0.odd? # => false
# Float-Prädikate
ZERO, INF, NAN = 0.0, 1.0/0.0, 0.0/0.0 # Konstanten zum Testen
ZERO.finite? # => true: ist diese Zahl endlich?
INF.finite? # => false
NAN.finite? # => false
ZERO.infinite? # => nil: ist diese Zahl unendlich? Positiv oder
Weitere Kostenlose Bücher