【问题标题】:groovy regex test failing常规正则表达式测试失败
【发布时间】:2011-07-20 11:40:15
【问题描述】:

在我的 Grails 1.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, '_')
    }
}

我已经创建了这个测试用例:

class EnumTransformerTests extends GroovyTestCase {

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

    void testCamelCaseTransformer() {
        EnumTransformer transformer = CamelCaseEnumTransformer.instance
        assertEquals 'a', transformer.transformName(TestEnum.A)
        assertEquals 'foo', transformer.transformName(TestEnum.FOO)

        // This test fails on the line below
        assertEquals 'fooBar', transformer.transformName(TestEnum.FOO_BAR)
    }
}

在上面标记的行上测试失败。我认为问题一定与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)

【问题讨论】:

    标签: regex grails groovy


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢,缺乏正式的方法来记录闭包需要多少参数是 Groovy 的一个痛点
    • 这是获得动态语言的代价。如果您的正则表达式中有 3 个匹配组,我很确定您需要 3 个参数闭包。
    • 事实并非如此。第二个闭包参数是一个List,它包含所有捕获的组。我编辑了您的代码以反映这一点。
    • @Don:谢谢……我还没用过这个方法,我只是根据你看到的错误信息猜测。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2013-10-17
    相关资源
    最近更新 更多