NSRegularExpression:如何从NSString中提取匹配的组?

时间:2014-06-25 01:40:55

标签: ios objective-c regex nsregularexpression

我的代码看起来像

    NSString *pattern = @"\\w+(\\w)";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                 options:NSRegularExpressionCaseInsensitive error:nil];
    NSString *testValue = @"Beer, Wine & Spirits (beer_and_wine)";
    NSTextCheckingResult *match = [regex firstMatchInString:testValue options:0 range:NSMakeRange(0, testValue.length)];
    for (int groupNumber=1; groupNumber<match.numberOfRanges; groupNumber+=1) {
        NSRange groupRange = [match rangeAtIndex:groupNumber];
        if (groupRange.location != NSNotFound)
            NSLog(@"match %d: '%@'", groupNumber, [testValue substringWithRange:groupRange]);
        else
            NSLog(@"match %d: '%@'", groupNumber, @"");
    }

我想做什么?
来自

NSString *testValue = @"Beer, Wine & Spirits (beer_and_wine)";

我想提取beer_and_wine

我得到了什么?
当我运行此代码时,没有任何匹配,所以没有打印出来

2 个答案:

答案 0 :(得分:2)

要匹配beer_and_wine,您可以使用这个简单的正则表达式:

(?<=\()[^()]*

demo

  • (?<=\()外观检查我们前面有一个左括号
  • [^()]*匹配任何不是括号的字符

在代码中,类似这样:

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=\\()[^()]*" options:NSRegularExpressionAnchorsMatchLines error:&error];
if (regex) {
    NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:subject options:0 range:NSMakeRange(0, [subject length])];
    if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) {
        NSString *result = [string substringWithRange:rangeOfFirstMatch];
    } else {
        // no match
    }
} else {
    // there's a syntax error in the regex
}

答案 1 :(得分:1)

您的正则表达式不正确,因此它与您期望的不匹配。请尝试以下方法:

NSString *pattern = @"\\((\\w+)\\)";