Case Insensitive list OptionParser

时间:2014-02-20 18:04:50

标签: ruby

我正在尝试使用Ruby的OptionParser来解析命令行参数。我的一个参数是一个预定义的可接受字符串列表,我将其定义为

opts.on('-p', '--project-name PROJECT', PROJECTS, 'The Project name', "{#{PROJECTS.join ', '}}"){|p| options.project = p}

其中PROJECTS是预定义的字符串列表(我在Ruby 1.8.7上)。如何告诉OptionsParser应该使用POJECTS列表以不区分大小写的方式匹配参数?我看到类OptionParser :: List可能有一些东西,我只是不确定如何使用它。

1 个答案:

答案 0 :(得分:2)

您可以传递Regexp而不是PROJECTS数组。最后的i修饰符使其不区分大小写:

/#{Regexp.union(PROJECTS).source}/i
#=> /foo|bar|baz/i

这是一个完整的工作示例:

require 'optparse'

options = Struct.new(:project).new

PROJECTS = %w{foo bar baz}
ALLOWED_PROJECTS = /#{Regexp.union(PROJECTS).source}/i

OptionParser.new do |opts|
  opts.on('-p', '--project-name PROJECT', ALLOWED_PROJECTS, 'The Project name', "{#{PROJECTS.join ', '}}") do |p|
    options.project = p
  end
end.parse!

p options

用法:

$ ruby foo.rb -p foo
#<struct project="foo">

$ ruby foo.rb -p FOO
#<struct project="FOO">

$ ruby foo.rb -p bar
#<struct project="bar">

$ ruby foo.rb -p bAz
#<struct project="baz">

$ ruby foo.rb -p quux
foo.rb:16:in `<main>': invalid argument: -p quux (OptionParser::InvalidArgument)