Groovy Base32 转换

发布于 2024-09-11 09:53:46 字数 272 浏览 9 评论 0原文

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

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

我可以想到 72 个正则表达式可以实现这一点,但这似乎有点矫枉过正,因为它

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

是如此容易

I am unable to use the fabulous tr() at the moment as I can only use Groovy 1.7.1 and wanted to know if there is an elegant way of going backwards and forwards between string and number encoded with Base32, but with the values A to Z then 2 to 7, rather than 0 to 9 then A to V.

This is to remove customer error in typing in a human readable code by not using zero or one.

I can think of 72 Regex expressions that would enable this, but that seems like overkill when

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

is SO much easier

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

因为看清所以看轻 2024-09-18 09:53:47

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 时,您只需删除此元魔法即可,无需更改其他来源。

The beauty of Groovy is its dynamic nature. If you need the feature, but it's not there, add it! Somewhere in a convenient entry point to your application, or in a static block in the class that needs it, add the code lifted straight from the 1.7.3+ sources:

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)
}

The nice thing about this is whenever you can upgrade to 1.7.3, you can just remove this meta-magic and you won't need to change your other sources.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文