Regex 如何在Groovy中中断方法的执行?

Regex 如何在Groovy中中断方法的执行?,regex,string,methods,groovy,Regex,String,Methods,Groovy,我有下面的代码和奇怪的东西,所以我打印了一些东西。当我传递给方法字符串时,它与正则表达式匹配-打印: ---------->1 ---------->2 这怎么可能?如何归还不同的物品 def getInfo(String nameOfFile) { def matcher = nameOfFile =~ /(\w+)_(\w+)_(\w+)/ if (matcher.matches()) { matcher.each { fullName, CN,

我有下面的代码和奇怪的东西,所以我打印了一些东西。当我传递给方法字符串时,它与正则表达式匹配-打印:

---------->1
---------->2
这怎么可能?如何归还不同的物品

def getInfo(String nameOfFile) {
    def matcher = nameOfFile =~ /(\w+)_(\w+)_(\w+)/
    if (matcher.matches()) {
        matcher.each { fullName, CN, FN, PN->
            println "---------->1"
            return [nameOfFile, CN, FN, PN]
        }
    }
    println "----------->2"
        return [nameOfFile]
}

这只是从
闭包返回,而不是从封闭方法返回

        return [nameOfFile, CN, FN, PN]
根据您试图执行的操作(您没有给出任何示例输入),您可能希望使用
findResult
而不是
每个

def getInfo( String nameOfFile ) {
    def matcher = nameOfFile =~ /(\w+)_(\w+)_(\w+)/
    if (matcher.matches()) {
        matcher.findResult { fullName, CN, FN, PN->
            [nameOfFile, CN, FN, PN]
        }
    }
    else {
        [nameOfFile]
    }
}

这只是从
闭包返回,而不是从封闭方法返回

        return [nameOfFile, CN, FN, PN]
根据您试图执行的操作(您没有给出任何示例输入),您可能希望使用
findResult
而不是
每个

def getInfo( String nameOfFile ) {
    def matcher = nameOfFile =~ /(\w+)_(\w+)_(\w+)/
    if (matcher.matches()) {
        matcher.findResult { fullName, CN, FN, PN->
            [nameOfFile, CN, FN, PN]
        }
    }
    else {
        [nameOfFile]
    }
}
下面是Java中Groovy代码的一个非常粗略的近似值(使用1.6):

import java.util.*;
导入java.util.regex.*;
界面封闭块{
每个对象(字符串…参数);
}
公共类运行程序{
公共列表getInfo(字符串名称文件){
列表结果=新建ArrayList();
Pattern regex=Pattern.compile(“(\\w+)\(\\w+)\”);
Matcher Matcher=regex.Matcher(nameOfFile);
if(matcher.matches()){
字符串fullName=matcher.group(0);
字符串CN=matcher.group(1);
字符串FN=matcher.group(2);
字符串PN=匹配器组(3);
ClosureBlock closure=新ClosureBlock(){
每个公共对象(字符串…参数){
列表结果=新建ArrayList();
字符串fullName=args[0];
字符串CN=args[1];
字符串FN=args[2];
字符串PN=args[3];
结果。添加(全名);
结果.添加(CN);
结果:添加(FN);
结果:添加(PN);
//此返回不退出getInfo()
System.out.println(“------------>1”);
返回结果;
}                
};
//每个都返回一个对象,但我们没有分配它
每个(全名、CN、FN、PN);
}
System.out.println(“------------>2”);
结果。添加(文件名称);
返回结果;
}   
公共静态void main(字符串…参数){
快速跑步者=新跑步者();
List=quick.getInfo(args[0]);
系统输出打印项次(列表);
}
}
重点是:

  • Runner
    使用each方法定义匿名内部类。在
    each
    方法中调用return不会退出
    getInfo
    方法
  • 即使
    each
    方法返回一个
    对象
    ,我们也不会将其分配给任何对象,因此
    getInfo
    中的
    列表不受影响
Java既丑陋又复杂。Groovy代码要优雅得多,但是关于您的问题,Java代码说明了这个想法。

这里是Java中Groovy代码的一个非常粗略的近似值(使用1.6):

import java.util.*;
导入java.util.regex.*;
界面封闭块{
每个对象(字符串…参数);
}
公共类运行程序{
公共列表getInfo(字符串名称文件){
列表结果=新建ArrayList();
Pattern regex=Pattern.compile(“(\\w+)\(\\w+)\”);
Matcher Matcher=regex.Matcher(nameOfFile);
if(matcher.matches()){
字符串fullName=matcher.group(0);
字符串CN=matcher.group(1);
字符串FN=matcher.group(2);
字符串PN=匹配器组(3);
ClosureBlock closure=新ClosureBlock(){
每个公共对象(字符串…参数){
列表结果=新建ArrayList();
字符串fullName=args[0];
字符串CN=args[1];
字符串FN=args[2];
字符串PN=args[3];
结果。添加(全名);
结果.添加(CN);
结果:添加(FN);
结果:添加(PN);
//此返回不退出getInfo()
System.out.println(“------------>1”);
返回结果;
}                
};
//每个都返回一个对象,但我们没有分配它
每个(全名、CN、FN、PN);
}
System.out.println(“------------>2”);
结果。添加(文件名称);
返回结果;
}   
公共静态void main(字符串…参数){
快速跑步者=新跑步者();
List=quick.getInfo(args[0]);
系统输出打印项次(列表);
}
}
重点是:

  • Runner
    使用each方法定义匿名内部类。在
    each
    方法中调用return不会退出
    getInfo
    方法
  • 即使
    each
    方法返回一个
    对象
    ,我们也不会将其分配给任何对象,因此
    getInfo
    中的
    列表不受影响

Java既丑陋又复杂。Groovy代码要优雅得多,但是关于您的问题,Java代码说明了这个想法。

谢谢,Tim。您第二次帮助我解决这个返回问题,但作为Java开发人员,我不理解。在描述Groovy文档时,您能给出它的URL吗。正式的。您基本上可以将它们视为匿名方法。如果您设想有一个定义
apply
方法的接口,那么在Java中您可以定义一个覆盖该方法的匿名类。从这个重写的方法返回不会从定义它的封闭方法返回,它只会从
apply
方法返回。我将寻找一些比这条蜿蜒的河流更好的定义和例子