Как назначить именованные группы в регулярном выражении локальным переменным

Я пытаюсь назначить именованные группы моих совпадений выражений регулярных выражений с локальными переменными. Например, я пытаюсь захватить строку для ввода даты и обратиться к именованной группе month и day как к локальным переменным:

input = "2015-01-24" 
expr = /\d{4}-(?<month>\d{2})-(?<day>\d{2})/ 
input =~ expr #=> 0

Однако month или day после совпадения являются неопределенными переменными. Как получить доступ к month и day как к локальным переменным?

Согласно документу Ruby, ввод имени групповой переменной вернет захваченный стоимость ("доллары" в этом примере)

/\$(?<dollars>\d+)\.(?<cents>\d+)/ =~ "$3.67" #=> 0 
dollars #=> "3"

Я был бы признателен за любые рекомендуемые ресурсы.


person writofmandamus    schedule 25.01.2015    source источник


Ответы (1)


Прочтите внимательнее тот документ, который вы процитировали:

Когда именованные группы захвата используются с литеральным регулярным выражением в левой части выражения и оператором =~, захваченный текст также назначается локальным переменным с соответствующими именами.

Ваш код:

input =~ expr

не подтверждает это в двух отношениях: (1) expr не является буквальным регулярным выражением, а является регулярным выражением, назначенным переменной, (2) у вас есть регулярное выражение с правой стороны.

Если вы следуете документу, вы можете ссылаться на захваты как на локальные переменные.

person sawa    schedule 25.01.2015
comment
ОП: то есть /\d{4}-(?<month>\d{2})-(?<day>\d{2})/ =~ "2015-01-24" #=> 0; month #=> "01"; day #=> "24". Это литерал слева, а не переменная. Спасибо, Sawa, присваивание локальным переменным было для меня новым. - person Cary Swoveland; 25.01.2015