Groovy Base32 преобразования - PullRequest
2 голосов
/ 24 июля 2010

Я не могу использовать потрясающий tr () в данный момент, так как я могу использовать только Groovy 1.7.1 и хотел узнать, существует ли элегантный способ перехода назад и вперед между строкой и числом, закодированным с помощью Base32, нозначения от A до Z, затем от 2 до 7, а не от 0 до 9, затем от A до V.

Это позволяет устранить ошибку клиента при вводе удобочитаемого кода без использования нуля или единицы.

Я могу вспомнить 72 выражения Regex, которые позволили бы это, но это кажется излишним, когда

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

НАСТОЛЬКО гораздо проще

1 Ответ

4 голосов
/ 25 июля 2010

Красота 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, вы можете просто удалить эту метамагию, и вам не нужно будет менять другие источники.

...