Regex groovy正则表达式测试失败

Regex groovy正则表达式测试失败,regex,grails,groovy,Regex,Grails,Groovy,在我的Grails1.3.6应用程序中,我编写了这个类 import org.apache.commons.lang.StringUtils /** * Implementation that converts a name such as <tt>FOO_BAR</tt> to <tt>fooBar</tt> */ @Singleton class CamelCaseEnumTransformer implements EnumTransf

在我的Grails1.3.6应用程序中,我编写了这个类

import org.apache.commons.lang.StringUtils

/**
 * Implementation that converts a name such as <tt>FOO_BAR</tt> to <tt>fooBar</tt>
 */
@Singleton
class CamelCaseEnumTransformer implements EnumTransformer {

    String transformName(Enum e) {

        String transformedName = e.name().toLowerCase()

        transformedName.replaceAll(/_([a-z])/) {
            it[1].toUpperCase()
        }
        StringUtils.remove(transformedName, '_')
    }
}
在上面标记的线路上,测试失败。我认为这个问题一定与
replaceAll
方法有关,因为这是第一次执行作为该方法的第二个参数传递的闭包

我得到的错误是:

groovy.lang.MissingMethodException: No signature of method: 
CamelCaseEnumTransformer$_transformName_closure1.doCall() 
is applicable for argument types: (java.lang.String, java.lang.String) values: [_b, b]
特别奇怪的是,如果我在Groovy控制台中运行下面的等效代码,一切似乎都正常工作

@Singleton
class CamelCaseEnumTransformer {

    String transformName(Enum e) {

        String transformedName = e.name().toLowerCase()

        transformedName.replaceAll(/_([a-z])/) {
            it[1].toUpperCase()
        }
    }
}

enum TestEnum {
    A, FOO, FOO_BAR, FOO_BAR_123,
}

def transformer = CamelCaseEnumTransformer.instance
assert 'fooBar' == transformer.transformName(TestEnum.FOO_BAR)

从错误消息文本来看,似乎闭包应该为正则表达式中的2个匹配项接受2个参数。请尝试以下操作:

    transformedName.replaceAll(/_([a-z])/) { wholeMatch, capturedGroups ->
        capturedGroups[0].toUpperCase();
    }

从错误消息文本来看,似乎闭包应该为正则表达式中的2个匹配项接受2个参数。请尝试以下操作:

    transformedName.replaceAll(/_([a-z])/) { wholeMatch, capturedGroups ->
        capturedGroups[0].toUpperCase();
    }

非常感谢,缺少一种正式的方法来记录一个闭包需要多少个参数,这对Groovy来说是一个痛点,这是获得动态语言所付出的代价。我很确定,如果你的正则表达式中有3个匹配的组,那么你需要一个3参数闭包。事实并非如此。第二个闭包参数是一个包含所有捕获组的
列表。我编辑了你的代码以反映这一点。@Don:谢谢你。。。我还没有使用这个特殊的方法,我只是根据您看到的错误消息进行猜测。非常感谢,缺少一种正式的方法来记录闭包需要多少个参数,这对Groovy来说是一个痛点。这是获得动态语言所付出的代价。我很确定,如果你的正则表达式中有3个匹配的组,那么你需要一个3参数闭包。事实并非如此。第二个闭包参数是一个包含所有捕获组的
列表。我编辑了你的代码以反映这一点。@Don:谢谢你。。。我还没有使用这个特定的方法,我只是根据您看到的错误消息进行猜测。