Ruby for Newbies Reguläre Ausdrücke

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.


Bevorzugen Sie ein Video-Tutorial?


Vorwort: Reguläre Ausdrücke

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.


Abgleich mit regulären Ausdrücken

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

MatchData-Objekte

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.


Verwendung regulärer Ausdrücke

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.


Fazit

Wir werden in Ruby reguläre Ausdrücke für Sie. Wenn Sie Fragen haben, hören wir sie in den Kommentaren.