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 @username
Problè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:
- Hashtag:
#(\\w+)
- 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];
Merci, cela fonctionne parfaitement aussi. – user3344977
ce motif se casse quand caractère spécial dans. – kalpesh
Vous pouvez utiliser (\\ S +) au lieu de (\\ w +) si vous voulez capturer des caractères spéciaux –