2012-04-27 11 views
8

Estoy construyendo una aplicación de Twitter para iPhone, y necesita detectar cuándo ingresa un hashtag o @mention dentro de una cadena en un UITextView.¿Cómo se detectan las palabras que comienzan con "@" o "#" dentro de un NSString?

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

Gracias por su ayuda!

+0

se necesitan para conseguir esos personajes durante la edición o después de la edición (tal vez llamando a una acción)? de acuerdo con este punto, puedo ayudarte – ilhnctn

Respuesta

22

Puede usar la clase NSRegularExpression con un patrón como # \ w + (\ w representa los caracteres de las palabras).

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); 
} 
+0

Esto está mal. Twitter actualizó recientemente los filtros de hashtag, y ahora solo admite ciertos caracteres no latinos. Por ejemplo, no coincidirá con hashtags árabes. –

+0

Eso debería ser '\\ w +' y no solo '\ w +'. – sch

+0

¿Cuál es el significado de +? – Nil

0
if([[test substringToIndex:1] isEqualToString:@"@"] || 
    [[test substringToIndex:1] isEqualToString:@"#"]) 
{ 
    bla blah blah 
} 
+0

No olvides verificar que el texto sea más largo que 1 antes de realizar operaciones de subcadena. De lo contrario, algunos usuarios ingresarán un mensaje vacío y se enojarán cuando la aplicación falle. –

2

Puede romper una cadena en trozos (palabras) mediante el uso de componentsSeparatedByString: y compruebe el primer carácter de cada uno.

O, si necesita hacerlo mientras el usuario está escribiendo, puede proporcionar un delegado para la vista de texto e implementar textView: shouldChangeTextInRange: replacementText: para ver los caracteres escritos.

+1

La definición de límites de palabras siempre será específica de la aplicación. componentsSeparatedByString: es una técnica decente, pero el programador todavía tiene que tomar decisiones sobre "cualquiera/o" y "A1" y "neoconservador" y un montón de otras construcciones. –

+0

Implementado esto de manera similar a continuación. Sin embargo, tienes un punto sobre los límites de las palabras. Uno podría tener hashtags como I # like/# love this. Hm .... – n13

1

Hizo una categoría de NSString para eso. Es muy simple: encuentra todas las palabras, devuelve todas las palabras que comienzan con # para obtener los hashtags.

segmento de código correspondiente a continuación - cambiar el nombre de los métodos & 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; 
} 
0

Así es como se puede hacer usando NSPredicate

Usted puede intentar algo como esto en el delegado UITextView:

- (void)textViewDidChange:(UITextView *)textView 
{ 
    _words = [self.textView.text componentsSeparatedByString:@" "]; 
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[cd] '@'"]; 
    NSArray* names = [_words filteredArrayUsingPredicate:predicate]; 
    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 are NSArrays.

0

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

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