如何在Android中使用正则表达式对文本进行着色

4

我有三个正则表达式:

Pattern mentionPattern = Pattern.compile("(@[A-Za-z0-9_-]+)");
Pattern hashtagPattern = Pattern.compile("(#[A-Za-z0-9_-]+)");
Pattern urlPattern = Patterns.WEB_URL;

我有一个字符串:
这是一段包含#sample#twitter以及链接http://tom_cruise.me@tom_cruise文本。
我需要使用上述三个正则表达式匹配此文本,并将匹配到的文本标记为蓝色,最终将结果显示在TextView中。请问如何实现?
需要注意的是,我不需要对文本进行Linkify处理,只需要着色即可。并且我没有使用Twitter4j库。
2个回答

7

我用http://www.google.com替换了http://tom_cruise.me。请尝试以下操作:

String a = "This is a #sample #twitter text of @tom_cruise with a link http://www.google.com";

Pattern mentionPattern = Pattern.compile("(@[A-Za-z0-9_-]+)");
Pattern hashtagPattern = Pattern.compile("(#[A-Za-z0-9_-]+)");
Pattern urlPattern = Patterns.WEB_URL;

StringBuffer sb = new StringBuffer(a.length());
Matcher o = hashtagPattern.matcher(a);

while (o.find()) {
    o.appendReplacement(sb, "<font color=\"#437C17\">" + o.group(1) + "</font>");
}
o.appendTail(sb);

Matcher n = mentionPattern.matcher(sb.toString());
sb = new StringBuffer(sb.length());

while (n.find()) {
    n.appendReplacement(sb, "<font color=\"#657383\">" + n.group(1) + "</font>");
}
n.appendTail(sb);

Matcher m = urlPattern.matcher(sb.toString());
sb = new StringBuffer(sb.length());

while (m.find()) {
    m.appendReplacement(sb, "<font color=\"#EDDA74\">" + m.group(1) + "</font>");
}
m.appendTail(sb);

textView.setText(Html.fromHtml(sb.toString()));

谢谢回答 :) 除了两个问题,一切似乎都没问题。我该如何使用颜色代码而不是蓝色?我尝试过了,但没有起作用。最终文本中的“@”和“#”也没有显示。 - Kaidul
请编辑您的答案,因为我的正则表达式有点错误。它应该是 (@[A-Za-z0-9_-]+) 而不是 @([A-Za-z0-9_-]+) 以及 (#[A-Za-z0-9_-]+) 而不是 #([A-Za-z0-9_-]+),然后不需要首先添加 @#。如果您可以解决颜色代码问题,请告诉我。 - Kaidul
1
@typedef 我已经通过一种hackish的方式解决了颜色代码问题,并在上面编辑了我的答案。我们在这里做的是将StringBuffer从一个Matcher传递到另一个Matcher。因此,带有(#[A-Za-z0-9_-]+)Matcher会破坏颜色代码。在我上面编辑的代码中,我首先将原始字符串传递给Pattern hashtagPattern,然后将任何输出传递给其他匹配器。这解决了您的颜色代码问题。感谢您的接受! - Vikram
现在你的代码完美地运行了!非常感谢!你救了我的一天! - Kaidul
1
很棒的代码,还可以使用SpannableString使其可点击,请参考http://stackoverflow.com/a/7837610/3736955 - Jemshit Iskenderov
显示剩余4条评论

0

看看SpannableStringSpannableStringBuilder。可以在https://dev59.com/8HHYa4cB1Zd3GeqPHA1I#16061128找到使用SpannableStringBuilder的示例。

您可以编写一个接受非样式化String并返回CharSequence的方法,如下所示:

private CharSequence getStyledTweet(String tweet){
    SpannableStringBuilder stringBuilder = new SpannableStringBuilder(tweet);
    //Find the indices of the hashtag pattern, mention pattern and url patterns 
    //and set the spans accordingly
    //...
    return stringBuilder;
}

然后使用上述返回值来设置TextView的文本

TextView tView = (TextView)findViewById(R.id.myText);
tView.setText(getStyledTweet(tweet));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接