2

我目前无法使用美妙的 tr(),因为我只能使用 Groovy 1.7.1,并且想知道是否有一种优雅的方式可以在使用 Base32 编码的字符串和数字之间来回移动,但值为 A到 Z 然后 2 到 7,而不是 0 到 9 然后 A 到 V。

这是为了消除客户在键入人类可读代码时的错误,不使用零或一。

我可以想到 72 个正则表达式可以实现这一点,但是当

tr( 'A-Z2-7', 0-9A-V')

容易多了

4

1 回答 1

4

Groovy 的美妙之处在于它的动态特性。如果您需要该功能,但它不存在,请添加它!在应用程序的一个方便入口点的某个地方,或者在需要它的类中的静态块中,添加直接从 1.7.3+ 源代码中提取的代码:

String.metaClass.'static'.tr = { String text, String source, String replacement ->
    if (!text || !source) { return text }
    source = expandHyphen(source)
    replacement = expandHyphen(replacement)

    // padding replacement with a last character, if necessary
    replacement = replacement.padRight(source.size(), replacement[replacement.size() - 1])

    return text.collect { original ->
        if (source.contains(original)) {
            replacement[source.lastIndexOf(original)]
        } else {
            original
        }
    }.join()
}


String.metaClass.'static'.expandHyphen = { String text ->
    if (!text.contains('-')) { return text }
    return text.replaceAll(/(.)-(.)/, { all, begin, end -> (begin..end).join() })
}

String.metaClass.tr = { String source, String replacement ->
    String.tr(delegate, source, replacement)
}

这样做的好处是,只要您可以升级到 1.7.3,您就可以删除此元魔法,而无需更改其他来源。

于 2010-07-25T00:32:28.687 回答