在Ruby的情况下使用带有正则表达式匹配的命名Captures ......什么时候?

Chr*_*ris 12 ruby regex capture switch-statement

我想使用命名捕获来解析用户输入以提高可读性.

当他们键入命令时,我想捕获一些参数并传递它们.我在case语句中使用RegExps,因此我无法分配返回值/pattern/.named_captures.

这是我希望能够做到的(例如):

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

kac*_*ick 14

命名捕获在此语法时设置局部变量.

regex-literal =~ string
Run Code Online (Sandbox Code Playgroud)

不要设置其他语法.#参见rdoc(re.c)

regex-variable =~ string

string =~ regex

regex.match(string)

case string
when regex
else
end
Run Code Online (Sandbox Code Playgroud)

我也喜欢命名捕获,但我不喜欢这种行为.现在,我们必须使用$〜以防语法.

case string
when /(?<name>.)/
  $~[:name]
else
end
Run Code Online (Sandbox Code Playgroud)

  • FWIW,RuboCop 建议使用 `$LAST_MATCH_INFO` 而不是 `$~`。[更多信息](https://github.com/bbatsov/ruby-style-guide#no-cryptic-perlims) (2认同)

Gab*_*ley 7

这很丑,但在Ruby 1.9.3中对我有用:

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

或者,您可以使用$~,$LAST_MATCH_INFO.的英文扩展名.