以下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"
}
型
4条答案
按热度按时间ljsrvy3e1#
m[0]
是第一个匹配对象。m[0][0]
是这场比赛中匹配的所有内容。m[0][1]
是这场比赛的第一个捕获。m[0][2]
是这场比赛中的第二个捕获。根据我所读到的内容(我不会用Groovy编程,也没有现成的拷贝),给定
字符串
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并写了一个例子:
型
cpjpxq1n2#
这是我能实现的与Perl代码最接近的匹配:
字符串
gorkyyrv3#
这是我对如何使用Groovy语法做到这一点的最佳理解(但也可以参见lfaraone的回应):
字符串
yfwxisqw4#
请注意,如果要使用
group()
方法检索组匹配,则需要将匹配代码放入条件中。使用以下代码:
字符串
运行上述代码(在Groovy 3.09,JVM 17.0.1中)的输出是:
型
所以
match1.group(1)
成功并返回正确的匹配mycn
。match2.group(2)
导致IllegalStateException
。所以
match
示例只在条件语句中被完全求值。