使用2种模式时遇到正则表达式问题

时间:2015-04-12 22:41:43

标签: ios objective-c regex nsregularexpression

我有一个我在UITextView更新期间调用的方法,可以帮助我检测主题标签和用户名提及,例如。 #hashtag@username

如果我只尝试一次检测一个代码,则此代码可以正常工作。我既可以检测主题标签,也可以只检测用户名。

我试图让它能够检测到它们。

以下是我的两个正则表达式模式:

  1. 标签:#(\\w+)
  2. 用户名:@(\\w+)
  3. 这是我的检测方法:

    - (NSMutableAttributedString*)decorateTags:(NSString *)stringWithTags{
    
    NSError *error = nil;
    
    // Hashtag detection
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+) | @(\\w+)" options:0 error:&error];
    
    NSArray *matches = [regex matchesInString:stringWithTags options:0 range:NSMakeRange(0, stringWithTags.length)];
    NSMutableAttributedString *attString=[[NSMutableAttributedString alloc] initWithString:stringWithTags];
    
    NSInteger stringLength = [stringWithTags length];
    
    for (NSTextCheckingResult *match in matches) {
    
        NSRange wordRange = [match rangeAtIndex:0];
    
        NSString* word = [stringWithTags substringWithRange:wordRange];
    
        // Set Foreground Color
        UIColor *foregroundColor = [UIColor blueColor];
        [attString addAttribute:NSForegroundColorAttributeName value:foregroundColor range:wordRange];
    
        NSLog(@"Found tag %@", word);
    
      }
       return attString;
    }
    

    上面的代码完美无缺,但就像我说的那样,它目前只设置为一次检测一个。所以我修改了正则表达式模式以搜索主题标签和用户名提及,我尝试使用像|, +, *, *+, ++, +,等几个运算符,但没有一个允许检测主题标签和用户名,只是在这里要清楚了。这是我的意思:

      

    "嗨 @John 查看 #hashtag "

    看看两者是如何突出显示的?这就是我需要的东西,但是在使用苹果正则表达式文档中提供的运算符进行测试后,我只能得到一个突出显示或者根本没有。

    例如,使用上面的示例代码,#hashtag将突出显示,但@John不会。

    以下是我尝试使用运算符的一些简单示例:

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

2 个答案:

答案 0 :(得分:2)

您使用的正则表达式只匹配第一个正则表达式。如果在开始迭代之前设置断点,则会看到匹配计数为1。

第二件事没有匹配的原因是因为正在计算|周围的空白。

使用像(#|@)(\\w+)这样的正则表达式适用于这种情况。我设置了一个示例项目来测试这个正则表达式并且它可以工作。

答案 1 :(得分:1)

我刚刚意识到我的| (OR)运算符代码很好。问题是操作员的每一侧都有一个额外的空间。

这是工作正则表达式:

[NSRegularExpression regularExpressionWithPattern:@"#(\\w+)|@(\\w+)" options:0 error:&error];