Как полужирный текст с ** текстом ** в строке - PullRequest
0 голосов
/ 30 января 2019

Я хочу выделить текст жирным шрифтом между **.Я попытался с помощью следующего кода, но безуспешно.Он создает весь текст жирным шрифтом.

Исходная строка: ** Привет **, Меня зовут ** XYZ ** с ** PQR ** "

Требуется вывод: Привет , Меня зовут XYZ с PQR

Это то, что я пробовал.

private SpannableStringBuilder getText() {
    String message = "**Hi**, My Name is **XYZ** with **PQR**";
    Pattern p = Pattern.compile(".+.+(.*?).+.+");
    Matcher matcher = p.matcher(message);

    SpannableStringBuilder spannable = new SpannableStringBuilder(message);
    StyleSpan span = new StyleSpan(Typeface.BOLD);
    while (matcher.find()) {
        spannable.setSpan(span, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
    return spannable;
}

Ответы [ 2 ]

0 голосов
/ 30 января 2019

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

 private SpannableStringBuilder getActivityText(String message) {
    Pattern p = Pattern.compile("(\\*\\*)(.*?)(\\*\\*)");
    Matcher matcher = p.matcher(message);

    SpannableStringBuilder spannable = new SpannableStringBuilder(message);
    List<StyleSpan> spans = new ArrayList<>();
    //for making text bold
    while (matcher.find()) {
        StyleSpan span = new StyleSpan(Typeface.BOLD);
        spannable.setSpan(span, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        spans.add(span);
    }
    //for removing ** text
    for (StyleSpan span : spans) {
        spannable.replace(spannable.getSpanStart(span), spannable.getSpanStart(span) + 2, "");
        spannable.replace(spannable.getSpanEnd(span) - 2, spannable.getSpanEnd(span), "");
    }

    return spannable;
}
0 голосов
/ 30 января 2019

Ваш шаблон регулярного выражения использует символ *, не экранируя его.Таким образом, он рассматривается как квантификатор, а не как символ для сопоставления.Исправление выражения должно позволить остальной части вашего кода работать как задумано.Чтобы протестировать шаблоны, вы можете использовать такие сайты, как regex101.com

Хотя я не тестировал это подробно, следующий шаблон является базовым и соответствует вашим потребностям: (\*\*)(.*?)(\*\*)

Это позволяет вам сопоставлять подстроки "** Hi **", "** XYZ **" и "** PQR **".Ваш код в настоящее время выделяет их целиком.Что вы, вероятно, хотите сделать, это удалить звездочки и вставить средний текст жирным шрифтом.

Согласно моему шаблону, ваш текст должен быть доступен в качестве второй подходящей группы.Таким образом, вы можете извлечь из него индексы, чтобы применить диапазон, и удалить из него все вхождения **.Для этого должны быть методы как в классах String, так и в регулярных выражениях.

Исходя из ваших точных потребностей, у вас будут разные ограничения и крайние случаи, например, что делать с "****"где средний текст пуст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...