Ruby Regex Black Magic

时间:2012-07-13 18:25:22

标签: ruby regex command-line-arguments

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

这就是代码的样子。在它之后有更多的代码实际上用布尔值执行函数,但这是处理参数的部分。

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[*]]

除非那个是大写的:

$ ./AutoTest.rb test[uSer]

Running Test "UserTest"

我可以得出的唯一结论是,这个正则表达式已经触及了黑魔法的秘密,此时它变得如此强大,甚至可以自己解析HTML。

但严重的是,这里发生了什么?

2 个答案:

答案 0 :(得分:3)

带有小写字母s的括号在bash中具有特殊含义。我通过以下方式发现了这一点:

$ echo test[S]
test[S]

$echo test[s]
tests

这适用于括号内的任何位置

$echo test[user]
tests

$echo test[uSer]
test[uSer]

仍然不知道这个黑魔法来自何处,但解决我的问题的方法是不再使用括号。

答案 1 :(得分:1)

试试这个:

./ AutoTest.rb“test [user]”