西洛!
我有一个带有一个参数的groovy脚本。论证必须是正则表达式。我想在参数中使用*,但总是得到:命令的语法不正确。
这是一个例子(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_*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)
答案 0 :(得分:0)
以下groovy脚本:
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
或排除其中一个地图条目:
$ groovy test.groovy "pine_{1,9}a"
key: e, value: pine___apple -> pine___a
不确定脚本的问题是什么。也许opts.p的处理就像其中一条评论所暗示的那样。
编辑1 :
另一种CliBuilder语法,由Tim Yates在他的回答中提到:
def opt = new CliBuilder().with {
p longOpt: 'pattern', args: 1
parse(args)
}
编辑2:解决方案
因为这被标记为已接受的答案,我将在此处添加最终成为解决方案的内容(我在下面对此进行了评论,但在浏览解决方案时评论并不是立即显而易见的)。
此问题是由用于启动常规的Windows groovy发行版startgroovy.bat
文件(see separate stackoverflow thread)中的错误引起的。问题在于Windows执行和参数处理,它发生在groovy程序甚至开始执行之前。在groovy的更高版本中有一个公平的机会,所以它可能值得尝试升级到最新版本。如果没有,上述主题中的答案应该可以修复startgroovy.bat
。
答案 1 :(得分:0)
认为这就是你捕捉opt
我假设你正在使用CliBuilder
我怀疑你错过了args: 1
参数定义中的p
def opt = new CliBuilder().with {
it.p('pattern', args: 1)
parse(args)
}
def map1 = [e:'pine___apple', f:'pineapple']
map1.each { entry ->
entry.value.find(~/$opt.p/) { match -> println entry.value}
}
正如你所描述的那样适合我......