Извлечение частей из регулярного выражения с NSRegularExpression - PullRequest
2 голосов
/ 07 марта 2012

Я хочу извлечь части строки с помощью NSRegularExpression.

Например, у меня есть эта строка:

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

И я хочу извлечь "UIKit", "0x00540c89", "UIApplication", "_callInitializationDelegatesForURL: полезная нагрузка: приостановлено:" и "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 ]

3 голосов
/ 11 марта 2012

Вам, очевидно, нужен способ сопоставления нескольких диапазонов с вашим регулярным выражением.Это делается с соответствующими группами, которые указаны в скобках.Затем вы можете использовать один из методов 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]]);
}
3 голосов
/ 07 марта 2012

Попробуйте:

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