захват строки до и после некоторых данных с использованием регулярных выражений в ObjectiveC - PullRequest
2 голосов
/ 22 января 2012

Я относительно новичок в выражениях регулярных выражений, и мне понадобился совет.

Цель состоит в том, чтобы получить данные в следующем формате в массив:

  • значение = 777
  • значение = 888

Из этих данных: "значение =! @ # 777! @ # Значение = @ # $ 888 *"

Вот мой код (Цель C):

NSString *aTestString = @"value=!@#777!@#value=@#$**888***";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"value=(?=[^\d])(\d)" options:0 error:&anError];

Итак, мои вопросы:

1) Может ли движок регулярных выражений собирать данные, которые разделены таким образом? Извлечение значения «value =», удаление данных мусора в середине, а затем группирование их по номеру «777» и т. Д.

2) Если это можно сделать, то допустимо ли мое выражение регулярного выражения? значение = (? = [^ \ д]) (\ d) * * тысяча двадцать-дв

Ответы [ 2 ]

3 голосов
/ 22 января 2012

Взгляд здесь (?=) здесь неправильный, вы не правильно избежали \d (становится \\d) и, что не менее важно, вы пропустили квантификаторы * (0 или более раз)и + (1 или более раз):

NSString *aTestString = @"value=!@#777!@#value=@#$**888***";
NSRegularExpression *regex = [NSRegularExpression
    regularExpressionWithPattern:@"value=[^\\d]*(\\d+)"
    options:0
    error:NULL
];

[regex 
    enumerateMatchesInString:aTestString
    options:0
    range:NSMakeRange(0, [aTestString length])
    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
        NSLog(@"Value: %@", [aTestString substringWithRange:[result rangeAtIndex:1]]);
    }
];

Редактировать: Вот более тонкий шаблон.Он перехватывает слово перед =, затем отбрасывает нецифровые символы и впоследствии перехватывает цифры.

NSString *aTestString = @"foo=!@#777!@#bar=@#$**888***";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\\w+)=[^\\d]*(\\d+)" options:0 error:NULL];

[regex 
    enumerateMatchesInString:aTestString
    options:0
    range:NSMakeRange(0, [aTestString length])
    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
        NSLog(
            @"Found: %@=%@",
            [aTestString substringWithRange:[result rangeAtIndex:1]],
            [aTestString substringWithRange:[result rangeAtIndex:2]]
        );
    }
];

// Output:
// Found: foo=777
// Found: bar=888
0 голосов
/ 22 января 2012

Регулярные выражения - это выражения, соответствующие заданному шаблону.Регулярное выражение может соответствовать, скажем, строке типа «value =! @ # 777», используя выражение типа «value = [# @!% ^ &] [0-9] », которое говоритсоответствует литералу "value =", а затем любой строке, состоящей из символов #, @,!,%, ^ и &, и, наконец, любой строке, состоящей из цифр.Но вы не можете использовать одно регулярное выражение само по себе, чтобы получить только те части строки, которые вам нужны, то есть «value = 777».

Итак, одним из решений было бы создание выражения, которое распознает строкитакие как «value =! @ # 777», а затем выполнить некоторую дальнейшую обработку этой строки, чтобы удалить некорректные символы.

Я думаю, вам будет лучше использовать NSScanner для сканирования данных и извлечения частейты хочешь.Например, вы можете использовать -scanString:intoString:, чтобы получить часть «value =», затем -scanCharactersFromSet:intoString:, чтобы удалить ненужную часть, а затем снова вызвать этот метод, чтобы получить набор цифр.

...