Ruby ist eine der beliebtesten Sprachen im Internet. Wir haben hier auf Nettuts + eine neue Session gestartet, die Sie in Ruby einführen wird, sowie die großartigen Frameworks und Tools, die mit der Ruby-Entwicklung einhergehen. In dieser Lektion betrachten wir die Verwendung von regulären Ausdrücken in Ruby.
Wenn Sie mit regulären Ausdrücken vertraut sind, werden Sie froh sein zu wissen, dass der Großteil der Syntax für das Schreiben der regulären Ausdrücke denjenigen von PHP, JavaScript oder [Ihrer Sprache hier] sehr ähnlich ist..
Wenn Sie nicht mit regulären Ausdrücken vertraut sind, sollten Sie sich unsere Regex-Tutorials hier auf Nettuts + ansehen, um sich auf den neuesten Stand zu bringen.
Genau wie alles andere in Ruby sind reguläre Ausdrücke reguläre Objekte: Sie sind Instanzen des Regexp
Klasse. Normalerweise erstellen Sie jedoch einen regulären Ausdruck mit der Standard-Literal-Syntax:
/ myregex / / \ (\ d 3 \) \ d 3 - \ d 4 /
Um zu beginnen, ist der einfachste Weg, einen Regex zu verwenden, es auf einen String anzuwenden und zu sehen, ob es eine Übereinstimmung gibt. Beide Strings und Regex-Objekte haben ein Spiel
Methode, die dies tut:
"(123) 456-7890" .match / \ (\ d 3 \) \ d 3 - \ d 4 / / \ (\ d 3 \) \ d 3 - \ d 4 /. Übereinstimmung "(123) 456-7890"
Beide Beispiele stimmen überein, und wir erhalten eine MatchData
Instanz zurück (schauen wir uns an MatchData
bald Objekte). Wenn es keine Übereinstimmung gibt, Spiel
wird zurückkehren Null
. Weil ein MatchData
Objekt wird ausgewertet wahr
, du kannst den ... benutzen Spiel
Methode in bedingten Anweisungen (wie eine if-Anweisung), und ignorieren Sie einfach, dass Sie einen Rückgabewert erhalten.
Es gibt eine andere Methode, mit der Sie regexp mit Strings abgleichen können: das ist das = ~
(der Gleichheitszeichen-Operator). Denken Sie daran, dass Operatoren Methoden in Ruby sind. Mögen Spiel
, diese Methode kehrt zurück Null
auf keinen Fall. Wenn es jedoch eine Übereinstimmung gibt, wird die numerische Position der Zeichenfolge zurückgegeben, an der die Übereinstimmung begann. Ebenso wie Match, haben beide Saiten und Regexx = ~
.
"Ruby for Newbies: Regular Expressions" = ~ / New / # => 9
Reguläre Ausdrücke werden nützlicher, wenn wir einige Daten herausfinden. Dies geschieht normalerweise mit Gruppierungen: Umschließen bestimmter Teile des regulären Ausdrucks in Klammern. Angenommen, wir möchten einen Vornamen, einen Nachnamen und einen Beruf in einer Zeichenfolge angeben, wobei die Zeichenfolge folgendermaßen formatiert ist:
str1 = "Joe Schmo, Klempner" str2 = "Stephen Harper, Premierminister"
Um die drei Felder zu erhalten, erstellen wir diese Ausdrücke:
re = / (\ w *) \ s (\ w *), \ s? ([\ w \ s] *) /
Dies entspricht einer beliebigen Anzahl von Wortzeichen, einigen Leerzeichen, einer beliebigen Anzahl von Wortzeichen, einem Komma, einigen optionalen Leerzeichen und einer beliebigen Anzahl von Wortzeichen oder Whitespace. Wie Sie sich vorstellen können, beziehen sich die Teile, einschließlich Wortzeichen, auf die Namen oder den Beruf, nach denen wir suchen, und werden daher in Klammern gesetzt.
Also lassen Sie uns das ausführen:
match1 = str1.match re match2 = str2.match re
Nun unser match1
und match2
Variablen halten MatchData
Objekte (weil unsere beiden Matches erfolgreich waren). Lass uns sehen, wie wir davon Gebrauch machen können MatchData
Objekte.
Während wir dies durchgehen, werden Sie feststellen, dass es verschiedene Möglichkeiten gibt, dieselben Daten aus unseren Daten zu holen MatchData
Objekt. Wir beginnen mit der übereinstimmenden Zeichenfolge: Wenn Sie sehen möchten, welche der ursprünglichen Zeichenfolge mit dem regulären Ausdruck abgeglichen wurde, verwenden Sie die Schnur
Methode. Sie können auch die []
(eckige Klammern) und übergeben Sie den Parameter 0
:
match1.string # => "Joe Schmo, Klempner" match1 [0] # (dies ist das Gleiche wie match1. [] 0) => "Joe Schmo, Klempner"
Was ist mit dem regulären Ausdruck selbst? Sie können das mit dem finden Regex
Methode.
match1.regex # => wsw, s [ws] (Dies ist die einzigartige Art und Weise, wie reguläre Ausdrücke von IRB angezeigt werden.
Wie wäre es nun mit den passenden Gruppen, die der Zweck dieser Übung waren? Erstens können wir sie mit nummerierten Indizes auf der MatchData
Objekt selbst; Natürlich sind sie in der Reihenfolge, in der wir sie gefunden haben:
match1 [1] # => "Joe" match1 [2] # => "Schmo" match1 [3] # => "Klempner" match2 [1] # => "Stephen" match2 [2] # => "Harper" match2 [3] # => "Premierminister"
Es gibt tatsächlich eine andere Möglichkeit, diese Captures zu erhalten: Dies gilt für die Array-Eigenschaft erfasst
; Da dies ein Array ist, ist es nullbasiert.
match1.captures [0] # => "Joe" match2.captures [2] # => "Premierminister"
Ob Sie es glauben oder nicht, es gibt tatsächlich einen dritten Weg, um Ihre Aufnahmen zu machen. Wenn Sie ausführen Spiel
oder = ~
, Ruby füllt eine Reihe globaler Variablen aus, eine für jede erfasste Gruppe in Ihrer Regex:
"Andrew Burgess" .match / (\ w *) \ s (\ w *) / # gibt ein MatchData-Objekt zurück, aber wir ignorieren, dass $ 1 # => "Andrew" $ 2 # => "Burgess"
Zurück zu MatchData
Objekte. Wenn Sie den String-Index eines bestimmten Captures ermitteln möchten, übergeben Sie die Captures-Nummer an Start
Funktion (hier möchten Sie die Nummer des Captures so, wie Sie es mit verwenden möchten []
Methode, nicht über erfasst
). Alternativ können Sie verwenden Ende
um zu sehen, wann das Capture endet.
m = "Nettuts + ist das beste" .match / (is) (the) / m [1] # = "" ist "m.begin 1 # => 8 m [2] # =>" end "m.end 2 # => 14
Es gibt auch die pre_match
und post_match
Methoden, die ziemlich ordentlich sind: Dies zeigt Ihnen, welcher Teil der Zeichenfolge vor und nach dem Match kam.
# m von oben m.pre_match # => "Nettuts +" m.post_match # => "best"
Das deckt ziemlich genau die Grundlagen der Arbeit mit regulären Ausdrücken in Ruby ab.
Da reguläre Ausdrücke beim Bearbeiten von Zeichenfolgen so nützlich sind, finden Sie mehrere Zeichenfolgenmethoden, die sie nutzen. Die nützlichsten sind wahrscheinlich die Substitutionsmethoden. Diese schließen ein
Sub
Sub!
gsub
gsub!
Diese sind für die Substitution bzw. für die globale Substitution vorgesehen. Der Unterschied ist das gsub
ersetzt alle Fälle unseres Musters, während Sub
ersetzt nur die erste Instanz in der Zeichenfolge.
So verwenden wir sie:
"einige Zeichenfolge" .sub / string /, "message" # => "einige Nachricht" "Der Mann im Park" .gsub / the /, "ein" # => "ein Mann in einem Park"
Wie Sie vielleicht wissen, handelt es sich bei den Bang-Methoden (Methoden, die mit einem Ausrufezeichen enden!) Um destruktive Methoden: Sie ändern die eigentlichen String-Objekte, anstatt die jetzt vorhandenen zurückzugeben. Zum Beispiel:
original = "Mein Name ist Andrew." new = original.sub / Mein Name ist /, "Hallo, ich bin" original # => Mein Name ist Andrew. "new # =>" Hallo, ich bin Andrew "original =" Wer bist du? "original. sub! / Wer ist /, "Und" Original # => "Und du?"
Neben diesen einfachen Beispielen können Sie auch komplexere Dinge tun:
"1234567890" / (\ d 3) (\ d 3) (\ d 4) / '(\ 1) \ 2- \ 3' # => "(123) 456-7890 "
Wir bekommen nicht MatchData
Objekte oder die globalen Variablen mit den Substitutionsmethoden; Wir können jedoch die Backslash-Nummer verwenden. Muster in der Ersatzzeichenfolge, wenn wir es in einfache Anführungszeichen setzen. Wenn Sie den erfassten String weiter bearbeiten möchten, können Sie anstelle des zweiten Parameters einen Block übergeben:
"Was ist los?". Gsub (/ \ S * /) | s | s.downcase # => "was ist los?"
Es gibt viele andere Funktionen, die reguläre Ausdrücke verwenden. Wenn Sie interessiert sind, sollten Sie auschecken String # scan
und String # split
, für Starter.
Wir werden in Ruby reguläre Ausdrücke für Sie. Wenn Sie Fragen haben, hören wir sie in den Kommentaren.