Обнаружение маркеров сносок внутри строк с помощью регулярных выражений

#java #android #regex

#java #Android #регулярное выражение

Вопрос:

Я использую регулярные выражения для обнаружения маркеров сносок, а затем форматирую их в верхние индексы в Android. Это вводит мой код:

 public static SpannedString formatFootnotes(String text) {
    SpannableString sp = new SpannableString(text);

    Pattern pat = Pattern.compile("\d \)");
    Matcher m = pat.matcher(text);

    while (m.find()) {
        sp.setSpan(SUPERSCRIPT, m.start(), m.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        sp.setSpan(SIZE, m.start(), m.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

    return new SpannedString(sp);
}
 

Приведенный выше код большую часть времени работает нормально. Однако иногда это не удается, когда сноска появляется после знаков препинания (запятая, точка), т.е.

это некоторый текст, 15)

У меня нет проблем, когда цифры появляются после буквенно-цифровых символов. Что не так с приведенным выше кодом?

Комментарии:

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

2. Я решил проблему. Вы правы, что это не имеет ничего общего с шаблоном регулярных выражений.

Ответ №1:

Причина проблемы в том, что setSpan() работает только тогда, когда первый аргумент не используется повторно. Таким образом, решением было бы создание объектов SuperscriptSpan и RelativeSizeSpan внутри цикла:

 public static SpannedString formatFootnotes(String text) {
    SpannableString sp = new SpannableString(text);

    Pattern pat = Pattern.compile("\d \)");
    Matcher m = pat.matcher(text);

    while (m.find()) {
        sp.setSpan(new SuperscriptSpan(), m.start(), m.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        sp.setSpan(new RelativeSizeSpan(0.8f), m.start(), m.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

    return new SpannedString(sp);
}