2014-02-20 152 views
0

我想用Ruby的OptionParser來解析命令行參數。我的一個參數是我定義這樣不區分大小寫OptionParser

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

其中PROJECTS是一個字符串的預定義列表(我是紅寶石1.8.7)接受字符串的預定義列表。我如何告訴OptionsParser應該使用POJECTS列表以不區分大小寫的方式匹配參數?我看到類OptionParser :: List可能有這樣的東西,我只是不知道如何使用它。

回答

1

您可以通過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) 
+0

不要你的意思'Regexp.union(項目)'而不是那個地圖/ escape/stringify/join/regexify的東西? –

+1

@ muistooshort我曾嘗試過'Regexp.union',但那麼您如何使得到的正則表達式不區分大小寫?如果你做'/#{Regexp.union PROJECTS}/i',你會得到匹配區分大小寫的'/(? - mix:foo | bar | baz)/ i',因爲混合的正則表達式有自己的修飾符。我能想到的唯一選擇是'Regexp.union PROJECTS.map {| p | /#{p}/i}'這並不會更好,並且會生成一個更復雜的正則表達式,例如'/(?i-mx:foo)|(?i-mx:bar)|(?i-mx:baz)/' 。 –

+0

@ muistooshort好的另一種選擇是'Regexp.new(Regexp.union(PROJECTS).source,Regexp :: IGNORECASE)',這是目前爲止我認爲最好的選擇。改變了我的答案。 –