4

私は3つの正規表現を持っています:

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

私は文字列を持っています:

これは、リンクhttp://tom_cruise.meを含む @tom_cruiseの#sample #twitterテキストです。

このテキストを上記の 3 つの正規表現と一致させ、一致したテキストを青で色付けし、最終的なテキストをTextView. どうすればそれを達成できますか?

テキストは必要なくLinkify、カラーリングのみが必要です。そして、私はTwitter4jライブラリを使用していません。

4

2 に答える 2

7

と交換http://tom_cruise.meしましたhttp://www.google.com。次のことを試してください。

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()));
于 2013-07-25T04:56:29.323 に答える
0

とを見てSpannableStringくださいSpannableStringBuilder。の使用例は、 https://stackoverflow.com/a/16061128/1321873SpannableStringBuilderにあります。

スタイルなしを受け入れ、次のよう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));
于 2013-07-25T04:55:19.437 に答える