NSRegularExpression enumerateMatchesInString: параметры: диапазон: usingBlock: дать нулевой результат?

Я использую регулярное выражение в синтаксическом анализаторе, однако, похоже, он дает один результат многим, это мой код: Regex:

self.seatSelectRegex = [NSRegularExpression regularExpressionWithPattern:@"Seat ([0-9]{1,2}): (.*) \\([$£€]?([0-9.]+) in chips\\).*$" options:NSRegularExpressionAnchorsMatchLines error:&error];

Код:

NSMutableDictionary *players = [[NSMutableDictionary alloc] init];
[self.seatSelectRegex enumerateMatchesInString:input options:NSMatchingCompleted range:NSMakeRange(0, input.length) usingBlock:
 ^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
{

    NSLog(@"%lu", result.range.length);
    Player *p = [[Player alloc] init];

    p.name = [input substringWithRange:[result rangeAtIndex:2]];
    p.seatNumber = [input substringWithRange:[result rangeAtIndex:1]].intValue;
    p.stack = [input substringWithRange:[result rangeAtIndex:3]].doubleValue;

    [players setValue:p forKey:p.name];
}];

Я ожидаю 3 результата с моим вводом, однако я получаю 4, где последний результат имеет диапазон с местоположением = 0 и длиной = 0 (первые три являются правильными). Это обычное поведение, и я должен просто проверить местоположение и длину диапазона, или есть где-то ошибка?

Для чего это стоит, это мой вклад:

PokerStars Hand #81669312371:  Hold'em No Limit ($0.01/$0.02 USD) - 2012/06/08 16:57:33 CET [2012/06/08 10:57:33 ET]
Table 'Icarus III' 6-max Seat #2 is the button
Seat 2: SanderDecler ($2 in chips) 
Seat 3: ehrli87 ($0.90 in chips) 
Seat 4: umar.11 ($1.60 in chips) 
ehrli87: posts small blind $0.01
umar.11: posts big blind $0.02
*** HOLE CARDS ***
Dealt to SanderDecler [Kh 7d]
SanderDecler: raises $0.04 to $0.06
ehrli87: folds 
umar.11: calls $0.04
*** FLOP *** [Jc Tc Jh]
umar.11: checks 
SanderDecler: bets $0.08
umar.11: raises $0.24 to $0.32
SanderDecler: folds 
Uncalled bet ($0.24) returned to umar.11
umar.11 collected $0.28 from pot
*** SUMMARY ***
Total pot $0.29 | Rake $0.01 
Board [Jc Tc Jh]
Seat 2: SanderDecler (button) folded on the Flop
Seat 3: ehrli87 (small blind) folded before Flop
Seat 4: umar.11 (big blind) collected ($0.28)
 Sander Declerck09 июн. 2012 г., 16:37
Да, у меня была та же проблема с каким-либо другим регулярным выражением, но так как мне нужен был только 1 результат, я просто использовал firstMatchInString: options: range: function ...
 Tim Pietzcker09 июн. 2012 г., 16:35
FWIW, ваше регулярное выражение, кажется, работает правильно (я получаю 3 совпадения в RegexBuddy, как и ожидалось).

Ответы на вопрос(1)

Решение Вопроса

NSMatchingReportCompletion вариант сenumerateMatchesInString:options:range:usingBlock:, ОтЯблочная документация:

If the NSMatchingReportCompletion matching option is specified, the Block object will be called once after matching is complete, with nil result and the NSMatchingCompleted matching flag is set in the flags passed to the Block, plus any additional relevant “NSMatchingFlags” from among NSMatchingHitEnd, NSMatchingRequiredEnd, or NSMatchingInternalError.

И причина, по которой вы видите последний вызов блока как диапазон с местоположением и длиной, равными 0, заключается в том, что вы отправляете сообщенияnil который вернетсяnil (которое является целым числом 0).

 Sander Declerck09 июн. 2012 г., 17:17
Спасибо! Это было это.
 09 июн. 2012 г., 17:19
Нет проблем. Не знал об этом варианте, поэтому спасибо за вопрос :)

Ваш ответ на вопрос