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