Ich weiß, dass ich eine Ruby-case-Anweisung schreiben kann, um eine Übereinstimmung mit regulären Ausdrücken zu überprüfen. Ich möchte jedoch die Übereinstimmungsdaten in meiner return-Anweisung verwenden. So etwas wie dieser Halbpseudocode:
foo = "10/10/2011"
case foo
when /^([0-9][0-9])/
print "the month is #{match[1]}"
else
print "something else"
end
Wie kann ich das erreichen?
Vielen Dank!
Nur eine Anmerkung: Ich verstehe, dass ich für einen einfachen Fall wie oben niemals eine switch-Anweisung verwenden würde, aber das ist nur ein Beispiel. In Wirklichkeit versuche ich, viele potenzielle reguläre Ausdrücke für ein Datum abzugleichen, das auf verschiedene Arten geschrieben werden kann, und es dann entsprechend mit Rubys Datumsklasse zu analysieren.
ruby
regex
switch-statement
Yuval Karmi
quelle
quelle
Antworten:
Die Verweise auf die neuesten Regex-Übereinstimmungsgruppen werden immer in Pseudovariablen gespeichert ,
$1
um$9
:Sie können auch die
$LAST_MATCH_INFO
Pseudovariable verwenden, um auf das gesamteMatchData
Objekt zuzugreifen. Dies kann nützlich sein, wenn benannte Captures verwendet werden:quelle
$1
,$2
...$9
oderRegexp.last_match(1)
wie von Rubocop empfohlenHier ist ein alternativer Ansatz, mit dem Sie das gleiche Ergebnis erzielen, jedoch keinen Schalter verwenden. Wenn Sie Ihre regulären Ausdrücke in ein Array einfügen, können Sie Folgendes tun:
Wenn Sie
m
außerhalb des Blocks deklarieren, ist dieser nach Abschluss des Blocks weiterhin verfügbarfind
undfind
wird angehalten, sobald der Block einen wahren Wert zurückgibt, sodass Sie das gleiche Verknüpfungsverhalten erhalten, das Sie von einem Schalter erhalten. Dies gibt Ihnen die volle Leistung,MatchData
wenn Sie es benötigen (vielleicht möchten Sie benannte Erfassungsgruppen in Ihren regulären Ausdrücken verwenden) und trennt Ihre regulären Ausdrücke gut von Ihrer Suchlogik (die möglicherweise klareren Code liefert oder nicht). Sie können sogar Ihre regulären Ausdrücke aus a laden Konfigurationsdatei oder wählen Sie, welche Gruppe von ihnen zur Laufzeit gewünscht wird.quelle
case
Ansatz nachgedacht . Vielleicht möchten Sie den Ansatz von mu in einem Thread-Szenario verwenden, anstatt eine globale Variable mit dem Fall-Ansatz (?)