Как написать инструкцию 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 соответственно.

542   2  

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

    Ничего не найдено.