2012-06-09 11 views
5

estoy usando una expresión regular en un programa de análisis, sin embargo, parece dar un resultado mucho, este es mi código: Regex:NSRegularExpression enumerateMatchesInString: options: range: usingBlock: dando un resultado nulo?

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

Código:

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' Estoy esperando 3 resultados con mi entrada, sin embargo, obtengo 4, donde el último resultado tiene un rango con ubicación = 0 y longitud = 0 (los tres primeros son todos correctos). ¿Es este comportamiento común y debería simplemente verificar la ubicación y la longitud del rango, o hay algún error en alguna parte?

Por lo que vale la pena, esta es mi entrada:

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, su expresión regular parece funcionar correctamente (obtengo 3 coincidencias en RegexBuddy, como era de esperar). –

+0

Sí, he tenido el mismo problema con alguna otra expresión regular, pero como solo necesitaba 1 resultado, acabo de utilizar el firstMatchInString: opciones: rango: función ... –

Respuesta

7

Esto se debe a que su uso de la opción NSMatchingReportCompletion con enumerateMatchesInString:options:range:usingBlock:. De Apples documentation:

Si se especifica la opción de concordancia NSMatchingReportCompletion, el objeto del bloque se llamará una vez después de la adaptación se ha completado, con resultado nulo y la bandera a juego NSMatchingCompleted se establece en las banderas que se pasan al bloque, además de cualquier adicional "NSMatchingFlags" relevante entre NSMatchingHitEnd, NSMatchingRequiredEnd o NSMatchingInternalError.

Y la razón de su viendo la última llamada de bloque como un rango con la ubicación y duración establecido como 0 es debido a que su envío de mensajes a nil que devolverá nil (que es el número entero 0).

+0

¡Gracias! Eso fue todo. –

+0

No hay problema. No sabía acerca de esa opción así que gracias por la pregunta :) –

Cuestiones relacionadas