8

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

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

谢谢你的帮助!

4

6 回答 6

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);
}
于 2012-04-27T15:43:16.090 回答
2

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

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

于 2012-04-27T15:41:29.973 回答
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;
}
于 2014-03-30T15:53:08.013 回答
0
if([[test substringToIndex:1] isEqualToString:@"@"] ||
   [[test substringToIndex:1] isEqualToString:@"#"])
{
    bla blah blah
}
于 2012-04-27T15:40:55.963 回答
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 是 NSArray。

于 2014-05-05T07:20:41.533 回答
0

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

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(#(\\w+)|@(\\w+)) " options:NSRegularExpressionCaseInsensitive error:&error];
于 2015-12-18T13:12:54.113 回答