使用NSRegularExpression从正则表达式中提取部分

时间:2012-03-07 12:30:21

标签: objective-c regex nsregularexpression

我希望使用NSRegularExpression提取字符串的一部分。

例如,我有这个字符串:

@"1   UIKit                               0x00540c89 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163";

我想提取“UIKit”,“0x00540c89”,“UIApplication”,“_ callInitializationDelegatesForURL:payload:suspended:”和“1163”。

我已经制作了正则表达式:

@"^[0-9]+\\s+[a-zA-Z]+\\s+0x[0-9a-zA-Z]+\\s+\\-\\s*\\[[a-zA-Z]+\\s+[_:a-zA-Z]+\\]\\s+\\+\\s+[0-9]+"

但我不知道我该怎么做。这是可能的。

    NSString *origen = @"1   UIKit                               0x00540c89 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163";
    // Setup an NSError object to catch any failures
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]+\\s+[a-zA-Z]+\\s+0x[0-9a-zA-Z]+\\s+\\-\\s*\\[[a-zA-Z]+\\s+[_:a-zA-Z]+\\]\\s+\\+\\s+[0-9]+" 
                                                                           options:NSRegularExpressionCaseInsensitive 
                                                                             error:&error];
    // create an NSRange object using our regex object for the first match in the string
    NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:origen options:0 range:NSMakeRange(0, [origen length])];
    // check that our NSRange object is not equal to range of NSNotFound
    if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) {
        // Since we know that we found a match, get the substring from the parent string by using our NSRange object
        NSString *substringForFirstMatch = [origen substringWithRange:rangeOfFirstMatch];
        NSLog(@"Extracted: %@",substringForFirstMatch);
    }

2 个答案:

答案 0 :(得分:3)

试试这个:

NSCharacterSet *separatorSet = [NSCharacterSet characterSetWithCharactersInString:@" -[]+?.,"];
NSMutableArray *array = [origen  componentsSeparatedByCharactersInSet:separatorSet];
[array removeObject:@""];

答案 1 :(得分:3)

你显然需要一种方法来匹配正则表达式的多个范围。这是通过匹配用括号表示的组来完成的。然后,您可以使用NSRegularExpression方法之一,为您提供NSTextCheckingResult而不是简单范围。 NSTextCheckingResult可以包含多个范围。

示例:

NSString *pattern = @"^[0-9]+\\s+([a-zA-Z]+)\\s+(0x[0-9a-zA-Z]+)\\s+\\-\\s*(\\[[a-zA-Z]+\\s+[_:a-zA-Z]+\\])\\s+\\+\\s+([0-9]+)";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern 
                                                                       options:NSRegularExpressionCaseInsensitive 
                                                                         error:&error];

NSTextCheckingResult *firstResult = [regex firstMatchInString:origen options:0 range:NSMakeRange(0, origen.length)];
if ([firstResult numberOfRanges] == 5) {
    //The range at index 0 contains the entire string.
    NSLog(@"1: '%@'", [origen substringWithRange:[firstResult rangeAtIndex:1]]);
    NSLog(@"2: '%@'", [origen substringWithRange:[firstResult rangeAtIndex:2]]);
    NSLog(@"3: '%@'", [origen substringWithRange:[firstResult rangeAtIndex:3]]);
    NSLog(@"4: '%@'", [origen substringWithRange:[firstResult rangeAtIndex:4]]);
}