Ich versuche gerade, einen String in mehrere Variablen umzuwandeln. Beispielzeichenfolge:
ryan_string = "RyanOnRails: This is a test"
Ich habe es mit diesem regulären Ausdruck mit 3 Gruppen abgeglichen:
ryan_group = ryan_string.scan(/(^.*)(:)(.*)/i)
Um nun auf jede Gruppe zuzugreifen, muss ich Folgendes tun:
ryan_group[0][0] (first group) RyanOnRails
ryan_group[0][1] (second group) :
ryan_group[0][2] (third group) This is a test
Das scheint ziemlich lächerlich und es fühlt sich an, als würde ich etwas falsch machen. Ich würde erwarten, dass ich so etwas tun kann:
g1, g2, g3 = ryan_string.scan(/(^.*)(:)(.*)/i)
Ist das möglich? Oder gibt es einen besseren Weg als wie ich es mache?
quelle
one, two, three = string.match(/(^.*)(:)(.*)/i).captures
in:one, two, three = string.match(/(^.*)(:)(.*)/i).try(:captures)
&.
Operator verwenden, um es wieder in eine Zeile zu bringen und es sogar zweimal zu verwenden, wenn es nur eine Erfassungsgruppe gibt. ZB ..,string.match(regex)&.captures&.first
Sie könnten Match verwenden stattdessen oder = ~ verwenden, um eine einzelne Übereinstimmung zu erhalten, und Sie können entweder auf die gleiche Weise auf die Übereinstimmungsdaten zugreifen oder einfach die speziellen Übereinstimmungsvariablen $ 1, $ 2, $ 3 verwenden
Etwas wie:
quelle
Sie können Ihre erfassten Übereinstimmungen benennen
Es funktioniert nicht, wenn Sie die Reihenfolge von Zeichenfolge und Regex umkehren.
quelle
Sie müssen entscheiden, ob es eine gute Idee ist, aber Ruby Regexp kann (automatisch) lokale Variablen definieren für Sie definieren!
Ich bin mir noch nicht sicher, ob diese Funktion fantastisch oder einfach nur verrückt ist, aber Ihre Regex kann lokale Variablen definieren.
(Schauen Sie unter http://ruby-doc.org/core-2.1.1/Regexp.html nach "lokale Variable".)
Hinweis: Wie in einem Kommentar erwähnt, gibt es eine ähnliche und frühere Antwort auf diese Frage von @toonsend ( https://stackoverflow.com/a/21412455 ). Ich glaube nicht, dass ich "gestohlen" habe, aber wenn Sie fair mit Lob sein und die erste Antwort ehren wollen, fühlen Sie sich frei :) Ich hoffe, dass keine Tiere verletzt wurden.
quelle
scan()
findet alle nicht überlappenden Übereinstimmungen des regulären Ausdrucks in Ihrer Zeichenfolge. Anstatt also ein Array Ihrer Gruppen zurückzugeben, wie Sie es zu erwarten scheinen, gibt es ein Array von Arrays zurück.Sie sind wahrscheinlich besser dran
match()
, wenn Sie das Array der Captures verwenden, indem Sie Folgendes verwendenMatchData#captures
:Sie können dies jedoch auch tun,
scan()
wenn Sie möchten:quelle