2012-06-09 3 views
5

ich einen regulären Ausdruck in einem Parser verwenden, jedoch scheint es, ein Ergebnis zu viel zu geben, das ist mein Code: Regex:NSRegularExpression enumerateMatchesInString: Optionen: Bereich: usingBlock: Geben Sie ein Null-Ergebnis?

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

Code:

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‘ Ich erwarte 3 Ergebnisse mit meiner Eingabe, aber ich bekomme 4, wobei das letzte Ergebnis einen Bereich mit Position = 0 und Länge = 0 hat (die ersten drei sind alle korrekt). Ist das übliche Verhalten und sollte ich nur den Ort und die Länge des Bereichs überprüfen, oder gibt es irgendwo einen Fehler?

Für was es wert ist, das ist mein Eingang:

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, Ihre Regex scheint korrekt zu funktionieren (ich bekomme 3 Übereinstimmungen in RegexBuddy, wie erwartet). –

+0

Ye, ich hatte das gleiche Problem mit einigen anderen Regex zu, aber da ich nur 1 Ergebnis dann brauchte, habe ich nur die ersteMatchInString: Optionen: Bereich: Funktion ... –

Antwort

7

Dies ist, weil Ihr die NSMatchingReportCompletion Option mit enumerateMatchesInString:options:range:usingBlock: verwenden. Von Apples documentation:

Wenn die NSMatchingReportCompletion passende Option angegeben wird, wird das Objekt Block einmal aufgerufen werden, nachdem Anpassung abgeschlossen ist, mit null Ergebnis und dem NSMatchingCompleted passende Flag in den Flags übergeben zur Block gesetzt, zuzüglich einer zusätzlichen relevante "NSMatchingFlags" aus NSMatchingHitEnd, NSMatchingRequiredEnd oder NSMatchingInternalError.

Und der Grund, Sie den letzten Bausteinaufruf als Bereich mit Lage und Länge als 0 gesetzt zu sehen ist, weil Ihre Nachrichten zu senden, die nilnil zurückkehren wird (das ist die ganze Zahl 0) gewonnen.

+0

Vielen Dank! Das war's. –

+0

Kein Problem. Wusste nicht über diese Option, also danke für die Frage :) –

Verwandte Themen