说我有
str = "DISABLE_THINGY=true -p my_profile"
要获取DISABLE_THINGY
(true
)的值,我可以使用
str.partition("DISABLE_THINGY=").last.split(' ').first
我不想这样做。
必须有一个库可以解析所有这些。
有人知道更好的方法吗?
答案 0 :(得分:2)
选择的答案太复杂,无法解决这么简单的问题。正则表达式很棒,但它们越复杂,它们就越有可能出错:
str = "DISABLE_THINGY=true -p my_profile"
str[/\w+=(\w+)/, 1] # => "true"
/\w+=(\w+)/
只是寻找"字"由=
加入。
有关详细信息,请参阅String's []
method。
如果您有多项作业并希望全部捕获它们,或者想要捕获这一项的名称和价值:
str = "DISABLE_THINGY=true -p my_profile"
str.scan(/\w+=\w+/).map { |s| s.split('=') } # => [["DISABLE_THINGY", "true"]]
返回一个数组数组,这可能很有用,或者,你可以将它转换为Hash:
str.scan(/\w+=\w+/).map { |s| s.split('=') }.to_h # => {"DISABLE_THINGY"=>"true"}
同样地:
str = "DISABLE_THINGY=true FOO=bar -p my_profile"
str.scan(/\w+=\w+/).map { |s| s.split('=') } # => [["DISABLE_THINGY", "true"], ["FOO", "bar"]]
str.scan(/\w+=\w+/).map { |s| s.split('=') }.to_h # => {"DISABLE_THINGY"=>"true", "FOO"=>"bar"}
答案 1 :(得分:1)
看看" Parse command line arguments in a Ruby script"。
如果你的所有论点都没有使用连字符,你可能需要对使用的正则表达式稍作调整,但这应该可以让你到达你需要去的地方。只需使用ARGV.join(' ')
var。
str
即可
调整上面提供的链接中的正则表达式,使您的用例工作在ENV变量与命令行参数的组合中:
args = Hash[ str.scan(/-{0,2}([^=\s]+)(?:[=\s](\S+))?/) ] => {"DISABLE_THINGY"=>"true", "p"=>"my_profile"}