0

所以我设法使用正则表达式发明了一些黑魔法。我正在尝试解析一些命令行参数,并且我想接受格式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"

实际上,任何带有小写字母 s 的东西都会失败:

$ ./AutoTest.rb test[user]

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

除非 s 大写:

$ ./AutoTest.rb test[uSer]

Running Test "UserTest"

然后我能得出的唯一结论是,这个正则表达式已经利用了 Black Magic 的秘密,并且在这一点上变得如此强大以至于它甚至可以自己解析 HTML。

但说真的,这里发生了什么?

4

2 回答 2

3

带有小写 s 的括号在 bash 中具有特殊含义。我通过执行以下操作发现了这一点:

$ echo test[S]
test[S]

$echo test[s]
tests

这适用于括号内任意位置的 s

$echo test[user]
tests

$echo test[uSer]
test[uSer]

仍然不知道这个黑魔法是从哪里来的,但我的问题的解决方案是不再使用括号。

于 2012-07-13T18:32:31.940 回答
1

试试这个:

./AutoTest.rb "测试[用户]"

于 2012-07-13T18:34:54.750 回答