Использование именованных захватов с соответствием регулярным выражениям в случае Руби ... когда? - PullRequest
12 голосов
/ 10 марта 2012

Я хочу проанализировать пользовательский ввод, используя именованные захваты для удобства чтения.

Когда они набирают команду, я хочу захватить некоторые параметры и передать их.Я использую RegExps в операторе case и поэтому не могу присвоить возврат /pattern/.named_captures.

Вот что я хотел бы сделать (например):

while command != "quit"
  print "Command: "
  command = gets.chomp
  case command
  when /load (?<filename>\w+)/
    load(filename)
  end
end

Ответы [ 2 ]

14 голосов
/ 10 марта 2012

именованные захваты установить локальные переменные при этом синтаксисе.

regex-literal =~ string

Не задан в другом синтаксисе.# См. rdoc (re.c)

regex-variable =~ string

string =~ regex

regex.match(string)

case string
when regex
else
end

Мне также нравятся именованные захваты, но мне не нравится это поведение.Теперь мы должны использовать $ ~ в случае синтаксиса.

case string
when /(?<name>.)/
  $~[:name]
else
end
7 голосов
/ 13 июня 2012

Это уродливо, но у меня работает в Ruby 1.9.3:

while command != "quit"
  print "Command: "
  command = gets.chomp
  case command
  when /load (?<filename>\w+)/
    load($~[:filename])
  end
end

В качестве альтернативы вы можете использовать английское расширение $~, $LAST_MATCH_INFO.

...