所以我设法用正则表达式创造了一些黑魔法。我正在尝试解析一些命令行参数,并且我想接受格式为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。
但严重的是,这里发生了什么?
答案 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]”