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