Wiem, że mogę napisać instrukcję w języku Ruby, aby sprawdzić dopasowanie do wyrażeń regularnych. Chciałbym jednak użyć danych dopasowania w mojej instrukcji zwrotu. Coś takiego jak ten pół-pseudokod:
foo = "10/10/2011"
case foo
when /^([0-9][0-9])/
print "the month is #{match[1]}"
else
print "something else"
end
Jak mogę to osiągnąć?
Dzięki!
Uwaga: rozumiem, że nigdy nie użyłbym instrukcji przełącznika w prostym przypadku, jak powyżej, ale to tylko jeden przykład. W rzeczywistości to, co próbuję osiągnąć, to dopasowanie wielu potencjalnych wyrażeń regularnych do daty, którą można zapisać na różne sposoby, a następnie odpowiednio przeanalizuję ją za pomocą klasy Date Rubiego.
ruby
regex
switch-statement
Yuval Karmi
źródło
źródło
Odpowiedzi:
Odniesienia do najnowszych grup dopasowywania wyrażeń regularnych są zawsze przechowywane w pseudozmiennych,
$1
aby$9
:case foo when /^([0-9][0-9])/ print "the month is #{$1}" else print "something else" end
Możesz także użyć
$LAST_MATCH_INFO
pseudozmiennej, aby uzyskać dostęp do całegoMatchData
obiektu. Może to być przydatne w przypadku używania nazwanych przechwytywania:case foo when /^(?<number>[0-9][0-9])/ print "the month is #{$LAST_MATCH_INFO['number']}" else print "something else" end
źródło
$1
,$2
...$9
lubRegexp.last_match(1)
jak zaleca rubocopOto alternatywne podejście, które daje ten sam wynik, ale nie używa przełącznika. Jeśli umieścisz swoje wyrażenia regularne w tablicy, możesz zrobić coś takiego:
res = [ /pat1/, /pat2/, ... ] m = nil res.find { |re| m = foo.match(re) } # Do what you will with `m` now.
Deklarowanie
m
poza blokiem pozwala na to, aby był on nadal dostępny po zakończeniufind
z blokiem ifind
zatrzyma się, gdy tylko blok zwróci wartość true, dzięki czemu uzyskasz takie samo zachowanie skrótów, jakie daje przełącznik. Daje ci to pełne,MatchData
jeśli tego potrzebujesz (być może chcesz użyć nazwanych grup przechwytywania w swoich wyrażeniach regularnych) i ładnie oddziela twoje wyrażenia regularne od logiki wyszukiwania (co może, ale nie musi, dać jaśniejszy kod), możesz nawet załadować swoje wyrażenia regularne z config lub wybierz, który z nich chcesz w czasie wykonywania.źródło
case
podejścia. Może chcesz użyć podejścia mu w scenariuszu wątkowym, zamiast zmiennej globalnej z podejściem do przypadku (?)