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

时间:2012-04-27 15:35:00

标签: objective-c ios twitter nsstring uitextview

我正在构建Twitter iPhone应用程序,它需要检测何时在UITextView中的字符串中输入主题标签或@ -mention。

如何找到" @"之前的所有单词;或"#" NSString中的字符?

感谢您的帮助!

6 个答案:

答案 0 :(得分:22)

您可以使用NSRegularExpression类,其格式为#\ w +(\ w代表单词字符)。

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

答案 1 :(得分:2)

您可以使用componentsSeparatedByString:将字符串分解为多个(单词),然后检查每个字符串的第一个字符。

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

答案 2 :(得分:1)

为此制作了一类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;
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

以下是使用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。

答案 5 :(得分:0)

使用以下表达式检测字符串中的@或#

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