2011-01-30 3 views
1

私はAndroid-App内でTwitter-Hashtagsにマッチする必要がありますが、私のコードはそれが想定していることをしていないようです。 私が思い付いたことは次のとおりです。この正規表現で何が問題になっていますか?

ArrayList<String> tags = new ArrayList<String>(0); 
Pattern p = Pattern.compile("\b#[a-z]+", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(tweet); // tweet contains the tweet as a String 
while(m.find()){ 
    tags.add(m.group()); 
} 

変数つぶやきはハッシュタグを含む定期的なつぶやきが含まれている - しかし、見つける()トリガされません。だから私は正規表現が間違っていると思う。

答えて

3

単語境界アンカー\bのために正規表現が失敗します。このアンカーは、単語以外の文字と単語文字(英数字)の間にのみ一致します。したがって、#の直前に置くと、英数字の文字がでない限り、正規表現が失敗します。の前に#!あなたの正規表現はfoobarfoo#hashtag blahblahblahのハッシュタグに一致しますが、foobarfoo #hashtag blahblahblahには一致しません。

使用#\w+代わりに、と覚えて、文字列内には、バックスラッシュを倍にする必要があります。

Pattern p = Pattern.compile("#\\w+"); 
+0

おかげでたくさん!あなたは私の一日を救った! – HPD

2

ハッシュタグと一致させる場合は、パターンは "#(\\ w +)"にする必要があります。これとツイート "retweet pizza to #pizzahut"を使って、m.group()を実行すると "#pizzahut"、m.group(1)は "pizzahut"となります。

編集:注意:HTML表示ではエスケープ文字としてバックスラッシュを使用していますが、Javaでは文字列リテラルにwを2つ使用する必要があります。