喂!
我有一个带有一个参数的普通脚本。该参数必须是正则表达式模式。我想在参数中使用*,但总是得到:该命令的语法不正确。
这是一个示例(opt.p是从arg获取的模式):
def map1 = [e:'pine___apple', f:'pineapple']
map1.each { entry ->
entry.value.find(~/$opt.p/) { match -> println entry.value}
}
我想通过这种方式从命令行使用脚本:
groovy test -p pine_*a
我希望结果将是:
pine___apple
pineapple
我尝试了这些解决方案等等,但没有任何效果:
pine_*a
"pine_*a"
'pine_*a'
pine_\*a
'pine_\*a'
"pine_\*a"
pine_'\*'a
pine_"\*"a
pine_'\\*'a
pine_"\\*"a
有人知道如何解决此问题?
非常感谢!
编辑:
我用:
Groovy版本:2.4.6 JVM:1.7.0_45供应商:Oracle Corporation操作系统:Windows 7我也使用CliBuilder:
def cli = new CliBuilder()
cli.with
{
p('pattern', args: 1, required: false)
}
def opt = cli.parse(args)
最佳答案
下面的常规脚本:
def map = [e:'pine___apple', f:'pineapple']
map.each { k, v ->
v.find(~/${args[0]}/) { println "key: $k, value: $v -> ${v.find(args[0])}" }
}
在调用时输出以下内容:
$ groovy test.groovy pine_*a
Checking key: e, value: pine___apple -> pine___a
Checking key: f, value: pineapple -> pinea
或排除以下 map 条目之一:
$ groovy test.groovy "pine_{1,9}a"
key: e, value: pine___apple -> pine___a
不确定脚本的问题是什么。也许像其中一项评论所建议的那样处理opts.p。
编辑1 :
Tim Yates在回答中提到的一种替代的CliBuilder语法:
def opt = new CliBuilder().with {
p longOpt: 'pattern', args: 1
parse(args)
}
编辑2:解决方案
因为这被标记为可接受的答案,所以我将在此处添加最终的解决方案(我在下面对此发表了评论,但是在浏览该解决方案时,评论不会立即显而易见)。
此问题是由用于启动groovy的Windows groovy分发
startgroovy.bat
文件(see separate stackoverflow thread)中的错误引起的。问题出在Windows执行和参数处理上,它出现在Groovy程序甚至开始执行之前。很有可能已在groovy的更高版本中对此进行了修复,因此可能值得尝试升级至最新版本。如果没有,上述线程中的答案应该可以修复startgroovy.bat
。
关于regex - 如何在Groovy的命令行参数中使用星号(*)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42158907/