Я знаю, что могу написать оператор case на Ruby, чтобы проверять соответствие регулярным выражениям. Однако я хотел бы использовать данные совпадения в моем операторе возврата. Что-то вроде этого полу-псевдокода:
foo = "10/10/2011"
case foo
when /^([0-9][0-9])/
print "the month is #{match[1]}"
else
print "something else"
end
Как я могу этого добиться?
Благодарность!
Просто примечание: я понимаю, что я бы никогда не использовал оператор switch для простого случая, как указано выше, но это только один пример. На самом деле то, что я пытаюсь достичь, - это сопоставление многих потенциальных регулярных выражений для даты, которые могут быть записаны различными способами, и последующий их анализ с помощью класса Date Ruby.
ruby
regex
switch-statement
Юваль Карми
источник
источник
Ответы:
Ссылки на последние согласования регулярных выражений групп всегда хранятся в псевдо переменных
$1
, чтобы$9
:case foo when /^([0-9][0-9])/ print "the month is #{$1}" else print "something else" end
Вы также можете использовать
$LAST_MATCH_INFO
псевдопеременную, чтобы получить доступ ко всемуMatchData
объекту. Это может быть полезно при использовании именованных захватов:case foo when /^(?<number>[0-9][0-9])/ print "the month is #{$LAST_MATCH_INFO['number']}" else print "something else" end
источник
$1
,$2
...$9
илиRegexp.last_match(1)
в соответствии с рекомендациями rubocopВот альтернативный подход, который дает тот же результат, но не использует переключатель. Если вы поместите свои регулярные выражения в массив, вы можете сделать что-то вроде этого:
res = [ /pat1/, /pat2/, ... ] m = nil res.find { |re| m = foo.match(re) } # Do what you will with `m` now.
Объявление
m
вне блока позволяет ему оставаться доступным послеfind
завершения работы с блоком иfind
остановится, как только блок вернет истинное значение, поэтому вы получите то же поведение быстрого доступа, которое дает вам переключатель. Это дает вам полную информацию,MatchData
если вам это нужно (возможно, вы хотите использовать именованные группы захвата в своих регулярных выражениях) и хорошо отделяет ваши регулярные выражения от вашей логики поиска (что может дать или не дать более четкий код), вы даже можете загрузить свои регулярные выражения из config или выберите, какой из них вы хотите во время выполнения.источник
case
подход. Может быть, вы хотите использовать подход mu в многопоточном сценарии, а не глобальную переменную с подходом case (?)