用于正则表达式匹配的Groovy语法

kno*_*orv 44 regex groovy

什么是以下Perl代码的Groovy等价物?

my $txt = "abc : groovy : def";
if ($txt =~ / : (.+?) : /) {
  my $match = $1;
  print "MATCH=$match\n"; 
  # should print "MATCH=groovy\n"
}
Run Code Online (Sandbox Code Playgroud)

我知道有多种方法可以做到这一点(包括常规的Java方式) - 但是这样做的"Groovy方式"是什么?

这是一种方法,但它感觉有点笨拙 - 特别是数组符号(m[0][1])感觉有点奇怪.有更好的方法吗?如果没有 - 请描述背后的逻辑m[0][1].

def txt = "java : groovy : grails"
if ((m = txt =~ / : (.+?) :/)) {
  def match = m[0][1]
  println "MATCH=$match"
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*ens 81

m[0]是第一个匹配对象.
m[0][0]是这场比赛中匹配的一切.
m[0][1]是这场比赛中的第一场比赛.
m[0][2]是这场比赛中的第二次捕获.

根据我所读到的内容(我不用Groovy编程或者有一个方便的副本),给出

def m = "barbaz" =~ /(ba)([rz])/;
Run Code Online (Sandbox Code Playgroud)

m[0][0]"bar"
m[0][1]"ba"
m[0][2]"r"
m[1][0]"baz"
m[1][1]"ba"
m[1][2]"z"

我无法忍受不知道我是否正确,所以我下载了groovy并写了一个例子:

def m = "barbaz" =~ /(ba)([rz])/;

println "m[0][0] " + m[0][0]
println "m[0][1] " + m[0][1]
println "m[0][2] " + m[0][2]
println "m[1][0] " + m[1][0]
println "m[1][1] " + m[1][1]
println "m[1][2] " + m[1][2]
Run Code Online (Sandbox Code Playgroud)


kno*_*orv 20

这是我可以实现的与Perl代码最接近的匹配:

def txt = "abc : groovy : def"
if ((m = txt =~ / : (.+?) : /)) {
  def match = m.group(1)
  println "MATCH=$match"
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么在`((m=...))`中使用双括号。我可以看到我收到一个错误,但我不明白为什么:`MultipleCompilationErrorsException:启动失败:.../test.groovy:2:期待')',找到'='@` (4认同)
  • 这会打印什么?肉眼看上去很混乱. (2认同)