2012-07-13 55 views
0

所以我设法用正则表达式创造了一些黑魔法。我试图解析一些命令行参数,并且我想接受格式为test[somethinginhere]的任何参数,其中“somethinginhere”是要运行的测试的名称。红宝石正规魔法黑色

这就是代码的样子。 Theres后面的代码实际上是用布尔值执行函数,但是这是处理参数的部分。

ARGV.each do |arg| 
    case arg.downcase 
     when "help" 
      @help = true 
     when "install" 
      @install = true 
     when "deploy" 
      @deploy = true 
     when "configure" 
      @configure = true 
     when /^test\[([a-z]+)\]$/ 
      @test << arg.downcase[/^test\[([a-z]+)\]$/,1] 
     else 
      @usage = true 
    end 

end 

现在,这里的地方魔法进来:这一计划将针对不包括小写字母“S”的任何测试名正常运行。下面将通过:

$ ./AutoTest.rb test[a] 
Running Test "ATest" 

$ ./AutoTest.rb test[b] 
Running Test "BTest" 

$ ./AutoTest.rb test[anything] 
Running Test "AnythingTest" 

下会失败:

$ ./AutoTest.rb test[s] 

Usage: AutoTest [help|install|deploy|configure|test[*]] 

但这会通过:

$ ./AutoTest.rb test[S] 

Running Test "STest" 

实际上,与它的一个小写的内线很少会失败:

$ ./AutoTest.rb test[user] 

Usage: AutoTest [help|install|deploy|configure|test[*]] 

除非是s大写:

$ ./AutoTest.rb test[uSer] 

Running Test "UserTest" 

的唯一结论,然后我可以来的是,这个正则表达式已经挖掘到黑魔法的秘密,在这一点上变得如此强大,它甚至可以解析它自己的HTML。

但严重的是,这是怎么回事?

回答

3

带小写字母s的括号在bash中有特殊含义。我做了以下发现了这个:

$ echo test[S] 
test[S] 

$echo test[s] 
tests 

这适用于S中的括号

$echo test[user] 
tests 

$echo test[uSer] 
test[uSer] 

仍然不知道哪里这个魔法是来自内部的任何地方,但解决我的问题是不再使用括号。

+0

使用任何类型的命令行也具有特殊的意义为您的外壳上的性格可能是一个坏主意。这包括几乎所有*转移数字部门中的所有内容,从'!'到')'。为什么不使用更传统的'--test = s'或'test s'类型语法呢? – tadman 2012-07-13 18:44:42

+0

'test s'不起作用,因为我允许用户将几个命令串在一起,例如'./AutoTest.rb安装deploy config test-all'。所以我要用短划线去。 – 2012-07-13 19:56:51

+0

如果您重新编写参数解析器来处理多部分参数,它将起作用。另一方面,要使用'rake'作为例子,你可能需要使用':'作为分隔符,比如'rake db:migrate'。 – tadman 2012-07-13 19:58:58

1

试试这个:

./AutoTest.rb“测试[用户]”

+0

这似乎工作正常。我不想每次都输入引号,所以我正在调整脚本以接受'test- *'而不是'test [*]' – 2012-07-13 18:39:49