Подтвердить что ты не робот

Как написать оператор switch Ruby (case... when) с регулярным выражением и обратными ссылками?

Я знаю, что я могу написать оператор case Ruby для проверки соответствия регулярным выражениям. Тем не менее, я хотел бы использовать данные сопоставления в моей инструкции return. Что-то вроде этого полу-псевдокода:

foo = "10/10/2011"

case foo
    when /^([0-9][0-9])/
        print "the month is #{match[1]}"
    else
        print "something else"
end

Как я могу это достичь?

Спасибо!


Просто примечание: я понимаю, что я бы никогда не использовал оператор switch для простого случая, как указано выше, но это только один пример. В действительности, я пытаюсь добиться соответствия многих потенциальных регулярных выражений для даты, которая может быть написана различными способами, а затем разбора ее с классом Ruby Date соответственно.

4b9b3361

Ответ 1

Ссылки на последние группы согласования регулярных выражений всегда хранятся в псевдо переменных $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

Ответ 2

Здесь альтернативный подход, который дает вам тот же результат, но не использует переключатель. Если вы поместите регулярные выражения в массив, вы можете сделать что-то вроде этого:

res = [ /pat1/, /pat2/, ... ]
m   = nil
res.find { |re| m = foo.match(re) }
# Do what you will with `m` now.

Объявление m вне блока позволяет ему оставаться доступным после find выполняется с блоком и find остановится, как только блок вернет истинное значение, чтобы вы получили то же самое короткое замыкание, которое дает вам коммутатор. Это дает вам полную MatchData, если вам это нужно (возможно, вы хотите использовать именованные группы захвата в своих регулярных выражениях) и красиво отделяет ваши регулярные выражения от ваша логика поиска (которая может или не может дать более четкий код), вы даже можете загружать свои регулярные выражения из файла конфигурации или выбирать, какой набор из них вам нужен во время выполнения.