如何在 String 中用 **text** 加粗文本

How to bold text with **text** in String

我想在 ** 之间加粗文本。我尝试使用以下代码但没有成功。它正在创建整个文本粗体。

Original String : **Hi**, My Name is **XYZ** with **PQR**"

Want Output : Hi, My Name is XYZ with 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;
}

您的正则表达式模式使用了 * 符号,但没有转义它。因此,它被视为量词而不是要匹配的字符。修复表达式应该让您的其余代码按预期工作。要测试模式,您可以使用 regex101.com

等网站

虽然我没有对此进行广泛测试,但以下模式是满足您需求的基本模式:(\*\*)(.*?)(\*\*)

这允许您匹配子字符串“**Hi**”、“**XYZ**”和“**PQR**”。您的代码目前将这些全部加粗。您可能想要做的是删除星号并以粗体插入中间文本。

按照我的模式,您的文本应该作为第二个匹配组可用。因此,您可以从中提取索引以应用跨度,并从中删除所有 ** 事件。字符串和正则表达式 类 中应该有方法可以用于此。

根据您的确切需求,您会有不同的约束和边缘情况,例如如何处理中间文本为空的“****”。

请使用此代码解决上述问题

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