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

时间:2009-04-18 22:43:40

标签: regex groovy

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

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

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

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

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

3 个答案:

答案 0 :(得分:77)

m[0]是第一个匹配对象 m[0][0]是此次比赛中匹配的所有内容 m[0][1]是此次比赛中的第一次捕获 m[0][2]是此次比赛中的第二次捕获。

基于我所阅读的内容(我不是在Groovy中编程或者有一个方便的副本),给定

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

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]

答案 1 :(得分:19)

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

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

答案 2 :(得分:0)

这是我最好的理解如何使用Groovy语法(但也参见lfaraone的回复):

import java.util.regex.Matcher

def txt = 'abc : groovy : def'
if (txt =~ ~/ : (.+?) : /) {
    def match = Matcher.lastMatcher[0][1]
    println "MATCH=$match"
}