2

Groovy 1.7.1 しか使用できないため、現時点では素晴らしい tr() を使用できません。また、Base32 でエンコードされた文字列と数値の間を前後に移動するエレガントな方法があるかどうかを知りたいと思っていましたが、値は A です。 0 から 9 の次に A から V ではなく、Z の次に 2 から 7 です。

これは、0 または 1 を使用しないことで、人間が判読できるコードを入力する際の顧客のエラーを取り除くためです。

これを可能にする 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 に答える