如何在 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;
}
我想在 ** 之间加粗文本。我尝试使用以下代码但没有成功。它正在创建整个文本粗体。
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;
}