¿Cómo usar NSScanner?

Acabo de leer el documento de NSScanner de Apple. Estoy tratando de obtener el número entero de esa cadena: @ “usuario registrado (3 bashs)”.

No puedo encontrar ningún ejemplo, cómo escanear entre paréntesis. ¿Algunas ideas?

Aquí está el código:

NSString *logString = @"user logged (3 attempts)"; NSScanner *aScanner = [NSScanner scannerWithString:logString]; [aScanner scanInteger:anInteger]; NSLog(@"Attempts: %i", anInteger); 

`Esto es lo que hago para obtener ciertos valores de una cadena

Primero tengo este método definido

 - (NSString *)getDataBetweenFromString:(NSString *)data leftString:(NSString *)leftData rightString:(NSString *)rightData leftOffset:(NSInteger)leftPos; { NSInteger left, right; NSString *foundData; NSScanner *scanner=[NSScanner scannerWithString:data]; [scanner scanUpToString:leftData intoString: nil]; left = [scanner scanLocation]; [scanner setScanLocation:left + leftPos]; [scanner scanUpToString:rightData intoString: nil]; right = [scanner scanLocation] + 1; left += leftPos; foundData = [data substringWithRange: NSMakeRange(left, (right - left) - 1)]; return foundData; } 

Entonces llámalo.

 foundData = [self getDataBetweenFromString:data leftString:@"user logged (" rightString:@"attempts)" leftOffset:13]; 

leftOffset es el número de caracteres de la cadena izquierda

Podría ser una manera más fácil y más limpia, pero esa fue mi solución.

La solución de Ziltoid funciona, pero es más código del que necesita.

No me molestaría en crear un NSScanner para la situación dada. NSCharacterSet y NSString le brindan todo lo que necesita:

  NSString *logString = @"user logged (3 attempts)"; NSString *digits = [logString stringByTrimmingCharactersInSet: [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]; NSLog(@"Attempts: %i", [digits intValue]); 

o en Swift:

  let logString = "user logged (3 attempts)" let nonDigits = NSCharacterSet.decimalDigitCharacterSet().invertedSet let digits : NSString = logString.stringByTrimmingCharactersInSet(nonDigits) NSLog("Attempts: %i", digits.intValue) 

Aquí hay una solución simple usando NSScanner (sí, @NSResponder tiene una solución muy buena!):

 NSString *logString = @"user logged (3 attempts)"; NSString *numberString; NSScanner *scanner = [NSScanner scannerWithString:logString]; [scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:nil]; [scanner scanCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:&numberString]; NSLog(@"Attempts: %i", [numberString intValue]); 

Salida NSLog:

 Attempts: 3 

NSScanner es un escáner lineal. Tienes que escanear las cosas que no quieres llegar a lo que quieres.

Podría hacer [aScanner scanUpToCharactersInSet:[NSCharacterSet decimalDigitCharacterSet] intoString:NULL] para saltar todo hasta el número de caracteres. Luego haces [aScanner scanInteger:&anInteger] para escanear el personaje en un entero.

aquí está el uso de reg-ex

 NSString *logString = @"user logged (3 attempts)"; NSString * digits = [logString stringByMatching:@"([+\\-]?[0-9]+)" capture:1];