如何检测在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];