Применяйте регулярное выражение повторно

#iphone #objective-c #ios #regex

#iPhone #objective-c #iOS #регулярное выражение

Вопрос:

У меня есть текстовые выражения, подобные этому:

 HIUPA:bla1bla1'HIUPD:bla2bla2'HIUPD:bla3bla3'HISYN:bla4bla4'
  

Я хочу извлечь следующие фрагменты текста:

 HIUPD:bla2bla2'
  

И

 HIUPD:bla3bla3'
  

Мой код Objective-C для этого выглядит так:

 -(void) ermittleKonten:(NSString*) bankNachricht
{
    NSRegularExpression* regexp;
    NSTextCheckingResult* tcr;
    regexp = [NSRegularExpression regularExpressionWithPattern:@"HIUPD.*'" options:0 error:nil];

    int numAccounts = [regexp numberOfMatchesInString:bankNachricht options:0 range:NSMakeRange(0, [bankNachricht length])];
    for( int i = 0; i < numAccounts;   i ) {
        tcr = [regexp firstMatchInString:bankNachricht options:0 range:NSMakeRange( 0, [bankNachricht length] )];
        NSString* HIUPD = [bankNachricht substringWithRange:tcr.range];
        NSLog(@"Found text is:n%@", HIUPD);
    }
}
  

В коде Objective-C numAccounts равно 1, но должно быть 2. И найденная строка выглядит так: «HIUPD: bla2bla2’HIUPD: bla3bla3’HISYN:bla4bla4′»

Я протестировал шаблон регулярных выражений с помощью онлайн-инструмента ( http://www.regexplanet.com/simple/index.html ). В онлайн-инструменте он работает нормально и выдает 2 результата, как я хочу.

Но я хотел бы получить тот же результат в коде ios, то есть «HIUPD: bla2bla2′» и «HIUPD: bla3bla3′». Что не так с шаблоном?

Ответ №1:

Вы выполняете жадное сопоставление с .* , поэтому регулярное выражение улавливает столько, сколько может в .* . Вы должны выполнять .*? или [^']* , чтобы * не совпадать с ' .