如何在字符串中用** text **加粗文本

时间:2019-01-30 10:48:12

标签: android string-formatting spannablestring

我想在**之间加粗文本。我尝试了以下代码,但没有成功。它以粗体显示整个文本。

  

原始字符串:**嗨**,我的名字是** XYZ **,带有** PQR **“

     

想要的输出:,我的名字是 XYZ ,带有 PQR

这是我尝试过的。

  scale_x_continuous(
    breaks = .$xpos %>% unique(),
    labels = .$Group %>% unique(),
    ...
  )

2 个答案:

答案 0 :(得分:1)

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

之类的网站

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

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

按照我的模式,您的文本应作为第二个匹配的组可用。因此,您可以从中提取索引以应用跨度,并从中删除所有**个实例。在String和regex类中都应该有可以用于此目的的方法。

根据您的确切需求,您将有不同的约束条件和特殊情况,例如在中间文本为空的情况下如何处理“ ****”。

答案 1 :(得分:1)

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

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