2012-06-09 10 views
5

używam wyrażenia regularnego w parsera, jednak wydaje się, aby dać jeden wynik dużo, to jest mój kod: Regex:Wyliczenie NSRegularExpressionMatchesInString: options: range: usingBlock: daje wynik zerowy?

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

Kod:

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]; 
}]; 

I Spodziewam się 3 wyników z moim wprowadzeniem, jednak otrzymuję 4, gdzie ostatni wynik ma zasięg z lokalizacją = 0 i długość = 0 (pierwsze trzy są poprawne). Czy to powszechne zachowanie i czy powinienem po prostu sprawdzić lokalizację i długość zakresu lub czy jest gdzieś błąd?

Na co warto, to jest mój wkład:

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) 
+0

FWIW, twoje regex wydaje się działać poprawnie (otrzymuję 3 dopasowania w RegexBuddy, zgodnie z oczekiwaniami). –

+0

Ye, miałem taki sam problem z innym regexem, ale ponieważ potrzebowałem tylko 1 wyniku, użyłem tylko firstMatchInString: options: range: function ... –

Odpowiedz

7

To dlatego, że za pomocą opcji NSMatchingReportCompletion z enumerateMatchesInString:options:range:usingBlock:. Od Apples documentation:

Jeśli dopasowanie opcja NSMatchingReportCompletion jest określony, obiekt Blok będzie wywoływana raz po dopasowywania jest kompletna, z zerową wyniku i pasującym flagą NSMatchingCompleted jest ustawiony w flagami przeszły do ​​bloku, a także wszelkie dodatkowe odpowiednie "NSMatchingFlags" spośród NSMatchingHitEnd, NSMatchingRequiredEnd lub NSMatchingInternalError.

i przyczyną obejrzeniu ostatniego połączenia bloku jako zakres z lokalizacji i długości jest ustawiony jako 0, ponieważ Twój wysyłanie wiadomości do nil który powróci nil (która jest liczbą całkowitą 0).

+0

Dziękuję! To było to. –

+0

Bez problemu. Nie wiedziałem o tej opcji, więc dzięki za pytanie :) –

Powiązane problemy