2011-07-29 9 views
8

Devo corrispondere al numero di occorrenze di n caratteri speciali in una stringa.
Ho pensato di creare un array con tutti questi caratteri (hanno più di 20) e creare una funzione per abbinarli a ciascuno di essi.
Ho solo la quantità totale di caratteri speciali nella stringa, quindi posso fare qualche calcolo matematico su di essi.Corrispondenza NSArray di caratteri Obiettivo-C

Quindi, nell'esempio:

NSString *myString = @"My string #full# of [email protected] [email protected] & symbols"; 
NSArray *myArray = [NSArray arrayWithObjects:@"#",@"@",@"&",nil]; 

La funzione dovrebbe restituire 5.

sarebbe più facile corrispondere ai caratteri che non sono nella matrice, prendere la lunghezza e l'uscita della stringa la differenza tra il stringa originale e quella senza caratteri speciali?
Questa è la soluzione migliore?

risposta

10
NSString *myString = @"My string #full# of [email protected] [email protected] & symbols"; 

    //even in first continuous special letters it contains -it will return 8 

//NSString *myString = @"#&#My string #full# of [email protected] [email protected] & symbols"; 



NSArray *arr=[myString componentsSeparatedByCharactersInSet:[NSMutableCharacterSet characterSetWithCharactersInString:@"#@&"]]; 

NSLog(@"resulted string : %@ \n\n",arr); 

NSLog(@"count of special characters : %i \n\n",[arr count]-1); 

USCITA:

portato stringa: (

"My string ", 

full, 

" of speci", 

"l ch", 

"rs ", 

" symbols" 

)

count of special characters : 5 
+0

perfetto! Grazie! – pasine

+1

Intelligente usare un metodo esistente invece di provare l'approccio della forza bruta. –

+0

benvenuto buddy.thanku :) –

2

È necessario utilizzare uno NSRegularExpression, perfetto per lo scenario. È possibile crearne uno in questo modo:

NSError *error = NULL; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(#|&)" options:NSRegularExpressionCaseInsensitive error:&error]; 

NSUInteger numberOfMatches = [regex numberOfMatchesInString:string options:0 range:NSMakeRange(0, [string length])]; 

Avvertenza: ho strappato il codice dal sito degli sviluppatori Apple. E io non sono un guru delle regex, quindi dovrai modificare lo schema. Ma ottieni il succo.

+0

vuoi dire usando qualcosa come \\ (# | @ | &) \\ come motivo invece di un array? – pasine

+0

Sì, uno schema proprio così. E @Matt Wilding: il potere della modifica significa che non ho idea di cosa tu stia parlando: P – Perception

+0

L'ho visto anche io !!! – vikingosegundo

1

Si dovrebbe guardare anche NSRegularExpression:

- (NSUInteger)numberOfCharacters:(NSArray *)arr inString:(NSString *)str { 
    NSMutableString *mutStr = @"("; 
    for(i = 0; i < [arr count]; i++) { 
     [mutStr appendString:[arr objectAtIndex:i]]; 
     if(i+1 < [arr count]) [mutStr appendString:@"|"]; 
    } 
    [mutStr appendString:@")"]; 
    NSRegularExpression *regEx = [NSRegularExpression regularExpressionWithPattern:mutStr options:NSRegularExpressionCaseInsensitive error:nil]; 
    NSUInteger *occur = [regExnumberOfMatchesInString:str options:0 range:NSMakeRange(0, [string length])]; 
    [mutStr release]; 
    return occur; 
} 

Esempio di utilizzo:

NSString *myString = @"My string #full# of [email protected] [email protected] & symbols"; 
NSArray *myArray = [NSArray arrayWithObjects:@"#",@"@",@"&",nil]; 
NSLog(@"%d",[self numberOfCharacters:myArray inString:myString]); // will print 5 
Problemi correlati