Regex 如何在groovy的命令行参数中使用星号(*)?

Regex 如何在groovy的命令行参数中使用星号(*)?,regex,groovy,command-line,arguments,syntax-error,Regex,Groovy,Command Line,Arguments,Syntax Error,你好 我有一个带有一个参数的groovy脚本。参数必须是正则表达式模式。我想在参数中使用*,但始终得到:命令的语法不正确。 这是一个示例(opt.p是从arg获取的模式): 我希望通过以下方式使用命令行中的脚本: groovy测试-p pine_*a 我希望结果是: 松树苹果 菠萝 我尝试了这些解决方案和更多,但没有任何效果: pine_*a “松树a” 'pine_*a' pine\*a 'pine\*a' “pine\*a” pine\*'a pine\*“a pine\\*'a pine\

你好

我有一个带有一个参数的groovy脚本。参数必须是正则表达式模式。我想在参数中使用*,但始终得到:命令的语法不正确。

这是一个示例(opt.p是从arg获取的模式):

我希望通过以下方式使用命令行中的脚本:

groovy测试-p pine_*a

我希望结果是:

松树苹果
菠萝

我尝试了这些解决方案和更多,但没有任何效果:
pine_*a

“松树a”

'pine_*a'

pine\*a

'pine\*a'

“pine\*a”

pine\*'a

pine\*“a

pine\\*'a

pine\\*“a

有人知道如何解决这个问题吗? 非常感谢

编辑:
我使用:
Groovy版本:2.4.6 JVM:1.7.045供应商:Oracle公司操作系统:Windows 7

def cli = new CliBuilder()
        cli.with
        {
            p('pattern', args: 1, required: false)
        }   
        def opt = cli.parse(args)

下面是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

Tim Yates在回答中提到的另一种CliBuilder语法:

def opt = new CliBuilder().with {
    p longOpt: 'pattern', args: 1
    parse(args)
} 
编辑2:解决方案

由于这被标记为已接受的答案,我将在此处添加最终成为解决方案的内容(我在下面对此有评论,但在浏览解决方案时,评论并不明显)


此问题是由用于启动groovy的windows groovy发行版
startgroovy.bat
文件()中的错误引起的。问题在于windows执行和参数处理,它甚至发生在groovy程序开始执行之前。这很有可能在groovy的后续版本中得到了修复,因此值得尝试升级到最新版本。如果没有,以上线程中的答案应该可以修复
startgroovy.bat

认为这是捕获
opt的方式

我猜你在用CliBuilder

我怀疑您错过了
p
参数定义中的
args:1

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}
}

正如你所描述的那样,它对我来说应该是有效的…

为什么你认为
opt.p
有你的论点?groovy中是否有设置此变量的代码?请尝试打印
opt.p
以查看它包含的内容。如果该值没有引号,则您将使用shell替换文件名。例如:
touch pine_愚弄_ya;groovy测试-p pine_*a
。传递正则表达式最安全的方法是使用单引号:
groovy test-p'pine_*a'
Yes。我使用CliBuilder,也使用args:1。我试过你的例子,但不适合我。我仍然有一个我之前提到的语法错误。我真的不知道是什么问题。我编辑了上面的问题,如何使用CliBuilder以及groovy的哪个版本。还有什么问题吗?我试过你的例子,用“pine_{1,9}a”arg我得到了与你相同的结果,但是pine_*a对我不起作用。我仍然有一个我之前提到的语法错误。我真的不知道是什么问题。我编辑了上面的问题,如何使用CliBuilder以及groovy的哪个版本。还有什么问题吗?你能试着引用
groovy test.groovy“ping”
?我试过了。仍然有语法错误。使用
test.groovy“pine_{1,9}a”
时,得到了与您相同的结果,但使用
groovy test.groovy“ping_*a”
时出现语法错误。根据前面的注释,根据您所使用的操作系统,使用单引号可能也值得一试。你能不能也做一个
entry->def val=/$p.opt/;println“的值是:'$val'
条目之前。value.find
这样我们就可以验证opt.p的值是我们认为的值。Oke。那么结果是:
C:\Users>groovy test.groovy-p“pine?”?"
值为:pine\uuuu?
值为:pine\uuu苹果
值为:pine\uuu?
菠萝groovy test.groovy-p'pine\uu?
值为:'pine\uu?
值为:'pine\uuu?
C:\Users>groovy test.groovy-p'pine*
命令语法不正确。
C:\Users>groovy test.groovy-p“pine”
该命令的语法不正确。
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}
}