2011-01-30 4 views
1

Je dois faire correspondre Twitter-hashtags dans une application Android, mais mon code ne semble pas faire ce qu'il est censé faire. Ce que je suis venu avec est:Quel est le problème avec cette regex?

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

Le tweet variable contient un tweet régulier, y compris hashtags - mais trouver() ne déclenche pas. Donc je suppose que mon expression régulière est fausse.

Répondre

3

Votre regex échoue en raison de l'ancre de délimitation de mots \b. Cette ancre ne correspond qu'à un caractère non-mot et un caractère-mot (caractère alphanumérique). Donc, le mettre directement devant le # provoque l'échec de l'expression régulière à moins qu'il n'y ait un caractère alphanumérique avant le #! Votre expression régulière correspondrait à un hashtag au foobarfoo#hashtag blahblahblah mais pas au foobarfoo #hashtag blahblahblah.

Utilisez #\w+ à la place, et rappelez-vous, dans une chaîne, vous devez les antislashs:

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

Merci beaucoup! Tu as sauvé ma journée! – HPD

2

Votre modèle doit être "# (\\ w +)" si vous essayez de faire correspondre le tag de hachage. En utilisant ceci et le tweet "retweet pizza à #pizzahut", faire m.group() donnerait "#pizzahut" et m.group (1) donnerait "pizzahut".

Editer: Notez que l'affichage html est en train de jouer avec les antislashs pour l'échappement, vous devrez en avoir deux pour le w dans votre chaîne littérale en Java.