如何检测在NSString中以“@”或“#”开头的单词?

我正在构build一个Twitter的iPhone应用程序,它需要检测何时在UITextView的string中inputhashtag或@ -mention。

如何在NSString中查找以“@”或“#”字符开头的所有单词?

谢谢你的帮助!

你可以使用类似于#\ w +(\ w代表单词字符)的模式来使用NSRegularExpression类。

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

你可以使用componentsSeparatedByString将一个string分解成多个部分(单词):然后检查每个字符的第一个字符。

或者,如果您需要在用户input时执行此操作,则可以为文本视图提供委托,并实现textView:shouldChangeTextInRange:replacementText:以查看input的字符。

为此做了一个NSString的类别。 非常简单:查找所有单词,返回以#开始的所有单词以获取标签。

下面的相关代码段 – 重命名这些方法和类别…

 @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 } 

以下是如何使用NSPredicate执行此操作的NSPredicate

你可以在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]; } 

_words,_searchResults和_oldArray是NSArrays。

使用以下expression式来检测string中的@或#

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