Lassen Sie uns ein interessanteres Programm schreiben. Diesmal prüfen wir, ob die Zeichenfolge mit der in der Kurzvorlage codierten Beschreibung übereinstimmt.
Bestimmte Zeichen und Zeichenkombinationen haben in diesen Mustern besondere Bedeutungen, darunter:
[] - definiert einen Bereich (z. B. bedeutet [az] Buchstaben im Bereich von a bis z
\w - Buchstabe oder Zahl, wie [0-9A-Za-z]
\W ist keine Zahl oder ein Buchstabe
\s - Leerzeichen wie [\t\n\r\f]
\S - keine Leerzeichen
\d - numerische Zeichen wie [0-9]
\D - keine Ziffernzeichen
\b - Backspace-Zeichen (0x08) (nur wenn im angegebenen Bereich)
\b - Ende des Wortes (außer im angegebenen Bereich)
\B - Wortgrenze
* - null oder mehr Wiederholungen des vorherigen Musters
+ - eine oder mehrere Wiederholungen des vorherigen Musters
{m, m} - mindestens m und keine Wiederholungen des vorherigen
? - mindestens eine Wiederholung des vorherigen
| - entweder der vorherige oder der nachfolgende Ausdruck kann übereinstimmen
() - Gruppierung
Der allgemeine Begriff für solche Muster ist * Reguläre Ausdrücke *. In Ruby wie in Perl werden sie meistens in Schrägstriche statt in doppelte Anführungszeichen eingeschlossen. Wenn Sie noch nie mit regulären Ausdrücken gearbeitet haben, kann es sinnvoll sein, einige Zeit damit zu verbringen, sie kennenzulernen. Sie haben eine Ausdruckskraft, die Ihnen Kopfschmerzen (und viele Zeilen unnötigen Codes) ersparen kann, wenn Sie Strings in einem Muster vergleichen, durchsuchen und bearbeiten müssen.
Angenommen, Sie möchten überprüfen, ob eine Zeichenfolge zu einer bestimmten Beschreibung passt: "Beginnt mit einem Kleinbuchstaben" f "gefolgt von einem Großbuchstaben und optional so lange wie möglich, bis ein Kleinbuchstabe angezeigt wird Wenn Sie ein erfahrener Benutzer sind C-Programmierer, Sie haben vielleicht schon Dutzende von Codezeilen in Ihrem Kopf geschrieben. Geben Sie es zu; Sie können sich selbst helfen. Aber in Ruby müssen Sie nur eine Abfrage gegen Ihren überprüften String mit dem folgenden regulären Ausdruck durchführen * / ^ f AZ * $ /. *
Was halten Sie davon, eine Hexadezimalzahl zu finden, die in dreieckige Klammern eingeschlossen ist? Kein Problem.
ruby> def chab(s) # "contains hex in angle brackets" | (s =~ /<0(x|X)(\d|[a-f]|[A-F])+>/) != nil | end nil ruby> chab "Not this one." false ruby> chab "Maybe this? {0x35}" # wrong kind of brackets false ruby> chab "Or this? <0x38z7e>" # bogus hex digit false ruby> chab "Okay, this: <0xfc0004>." true
Während reguläre Ausdrücke auf den ersten Blick ziemlich kryptisch sein können, werden Sie schnell darauf zurückkommen.
Hier ist ein kleines Programm, das Ihnen hilft, mit regulären Ausdrücken zu experimentieren. Speichern Sie es in der Datei regx.rb und führen Sie " ruby regx.rb" in der Befehlszeile aus.
# Requires an ANSI terminal! st = "\033[7m" en = "\033[m" while TRUE print "str> " STDOUT.flush str = gets break if not str str.chop! print "pat> " STDOUT.flush re = gets break if not re re.chop! str.gsub! re, "#{st}\\&#{en}" print str, "\n" end print "\n"
Dieses Programm erfordert eine zweimalige Eingabe, das erste Mal eine Zeichenfolge und das zweite Mal einen regulären Ausdruck. Die Zeichenfolge wird durch den regulären Ausdruck validiert und dann mit hervorgehobenen Teilen gedruckt, die dem regulären Ausdruck entsprechen.
str> foobar pat> ^fo+ foobar ~~~
Das passende Teil ist in der Auflistung mit der folgenden Zeile * "~~~" gekennzeichnet.*
Versuchen wir es mit weiteren Eingaben.
str> abc012dbcd555 pat> \d abc012dbcd555 ~~~ ~~~
Wenn Sie die Ausgabe des Programms überrascht, lesen Sie die Liste am Anfang des Artikels: * \ d * bezeichnet den Vergleich mit einer Ziffer.
Was ist, wenn es mehr als eine Möglichkeit gibt, Muster richtig zu vergleichen?
str> foozboozer pat> f.*z foozboozer ~~~~~~~~
foozbooz war eine vergleichbare Sequenz, statt nur fooz sind mit regulären Ausdrücken lange Teilstringvergleiche möglich.
Und hier ist ein Beispiel für das Finden einer Zeichenfolge im Laufe der Zeit.
str> Wed Feb 7 08:58:04 JST 1996 pat> [0-9]+:[0-9]+(:[0-9]+)? Wed Feb 7 08:58:04 JST 1996 ~~~~~~~~
- "= ~" * ist der Vergleichsoperator für reguläre Ausdrücke. Es gibt die Position des gefundenen Strings zurück oder * nil *, wenn der String vom Muster des regulären Ausdrucks nicht gefunden wurde.