以下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"
}
答案 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"
}