¿Cómo detectas palabras que comienzan con "@" o "#" dentro de un NSString?

Estoy desarrollando una aplicación de Twitter para iPhone, y necesita detectar cuando ingresas un hashtag o @ -mention dentro de una cadena en una UITextView.

¿Cómo encuentro todas las palabras precedidas por los caracteres "@" o "#" dentro de un NSString?

¡Gracias por tu ayuda!

Puede usar la class NSRegularExpression con un patrón como # \ w + (\ w significa caracteres de palabra).

NSError *error = nil; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+)" options:0 error:&error]; NSArray *matches = [regex matchesInString:string options:0 range:NSMakeRange(0, string.length)]; for (NSTextCheckingResult *match in matches) { NSRange wordRange = [match rangeAtIndex:1]; NSString* word = [string substringWithRange:wordRange]; NSLog(@"Found tag %@", word); } 

Puedes dividir una cadena en pedazos (palabras) usando componentes Separados por Transmisiones: y luego verifica el primer carácter de cada uno.

O bien, si necesita hacerlo mientras el usuario escribe, puede proporcionar un delegado para la vista de text e implementar textView: shouldChangeTextInRange: replacementText: para ver los caracteres tipeados.

Hice una categoría de NSString para eso. Es muy simple: encuentre todas las palabras, devuelva todas las palabras que comienzan con # para get los hashtags.

El segmento de código relevante a continuación: cambia el nombre de esos methods y la categoría también …

 @implementation NSString (PA) // all words in a string -(NSArray *)pa_words { return [self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; } // only the hashtags -(NSArray *)pa_hashTags { NSArray *words = [self pa_words]; NSMutableArray *result = [NSMutableArray array]; for(NSString *word in words) { if ([word hasPrefix:@"#"]) [result addObject:word]; } return result; } 
 if([[test substringToIndex:1] isEqualToString:@"@"] || [[test substringToIndex:1] isEqualToString:@"#"]) { bla blah blah } 

A continuación, le indicamos cómo puede hacerlo utilizando NSPnetworkingicate

Puede intentar algo como esto en el delegado UITextView:

 - (void)textViewDidChange:(UITextView *)textView { _words = [self.textView.text componentsSeparatedByString:@" "]; NSPnetworkingicate* pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"SELF BEGINSWITH[cd] '@'"]; NSArray* names = [_words filtenetworkingArrayUsingPnetworkingicate:pnetworkingicate]; if (_oldArray) { NSMutableSet* set1 = [NSMutableSet setWithArray:names]; NSMutableSet* set2 = [NSMutableSet setWithArray:_oldArray]; [set1 minusSet:set2]; if (set1.count > 0) NSLog(@"Results %@", set1); } _oldArray = [[NSArray alloc] initWithArray:names]; } 

donde _words, _searchResults y _oldArray son NSArrays.

Use la siguiente expresión para detectar @ o # en cadena

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