2015-04-12 1 views
0

J'ai une méthode que j'appelle pendant UITextView mises à jour qui m'aide à détecter les hashtags et les mentions de nom d'utilisateur, par exemple. #hashtag et @usernameProblème avec l'expression régulière lors de l'utilisation de 2 modèles

Ce code fonctionne parfaitement si j'essaie seulement de détecter un à la fois. Je peux soit détecter les hashtags seulement, ou les mentions de nom d'utilisateur seulement. J'essaie de faire en sorte qu'il va détecter les deux.

Voici mes deux modèles regex:

  1. Hashtag: #(\\w+)
  2. Nom d'utilisateur: @(\\w+)

Voici ma méthode de détection:

- (NSMutableAttributedString*)decorateTags:(NSString *)stringWithTags{ 

NSError *error = nil; 

// Hashtag detection 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+) | @(\\w+)" options:0 error:&error]; 

NSArray *matches = [regex matchesInString:stringWithTags options:0 range:NSMakeRange(0, stringWithTags.length)]; 
NSMutableAttributedString *attString=[[NSMutableAttributedString alloc] initWithString:stringWithTags]; 

NSInteger stringLength = [stringWithTags length]; 

for (NSTextCheckingResult *match in matches) { 

    NSRange wordRange = [match rangeAtIndex:0]; 

    NSString* word = [stringWithTags substringWithRange:wordRange]; 

    // Set Foreground Color 
    UIColor *foregroundColor = [UIColor blueColor]; 
    [attString addAttribute:NSForegroundColorAttributeName value:foregroundColor range:wordRange]; 

    NSLog(@"Found tag %@", word); 

    } 
    return attString; 
} 

Le code ci-dessus fonctionne parfaitement , mais comme je l'ai dit, il est actuellement mis en place pour décevoir ct un à la fois. J'ai donc modifié le modèle regex pour rechercher des hashtags et des mentions de nom d'utilisateur, et j'ai essayé d'utiliser plusieurs opérateurs comme |, +, *, *+, ++, +, etc et aucun ne permet de détecter à la fois les hashtags et noms d'utilisateur, et juste pour être clair:

"Hey @John vérifier cette #hashtag"

Voyez comment les deux sont mis en évidence? C'est ce dont j'ai besoin, mais après avoir testé avec les opérateurs fournis dans les documents Apple regex, je ne peux que soit obtenir un à mettre en évidence ou pas du tout. Par exemple avec l'exemple de code ci-dessus, #hashtag mettra en surbrillance mais @John ne le fera pas.

Voici quelques exemples rapides de la façon dont j'ai essayé d'utiliser les opérateurs:

[NSRegularExpression regularExpressionWithPattern:@"#(\\w+) + @(\\w+)" options:0 error:&error]; 

[NSRegularExpression regularExpressionWithPattern:@"#(\\w+) | @(\\w+)" options:0 error:&error]; 

[NSRegularExpression regularExpressionWithPattern:@"#(\\w+) * @(\\w+)" options:0 error:&error]; 

Répondre

2

Le regex que vous utilisez correspond uniquement à la première. Si vous définissez un point d'arrêt avant de commencer à itérer, vous verrez que le nombre de matches est 1.

La raison en est que les espaces blancs entourant le | est compté n'est pas adapté la deuxième chose.

L'utilisation d'une expression régulière telle que (#|@)(\\w+) fonctionne dans ce cas. J'ai mis en place un exemple de projet pour tester cette regex et cela fonctionne.

+0

Merci, cela fonctionne parfaitement aussi. – user3344977

+0

ce motif se casse quand caractère spécial dans. – kalpesh

+1

Vous pouvez utiliser (\\ S +) au lieu de (\\ w +) si vous voulez capturer des caractères spéciaux –

1

Je viens de réaliser que mon code avec l'opérateur | (OR) était très bien. Le problème était qu'il y avait un espace supplémentaire de chaque côté de l'opérateur.

Voici le regex travail:

[NSRegularExpression regularExpressionWithPattern:@"#(\\w+)|@(\\w+)" options:0 error:&error];