2012-07-13 54 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