2010-11-15 19 views
25

Ho ottenuto una stringa come "stackoverflow.html" e nello stack "espressione regolare" (. ) .html "Mi piacerebbe avere il valore in (.).Come ottenere le corrispondenze in iOS usando l'espressione regolare?

ho potuto trovare solo NSPredicate come:

NSString *string  = @"stackoverflow.html"; 
NSString *expression = @"stack(.*).html"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", expression]; 
BOOL match = [predicate evaluateWithObject:string] 

Ma che dice solo ho ottenuto una partita e non restituisce una stringa, quando uso NSRegularExpression:

NSRange range = [string rangeOfString:expression options:NSRegularExpressionSearch|NSCaseInsensitiveSearch]; 
if (range.location == NSNotFound) return nil; 

NSLog (@"%@", [string substringWithRange:(NSRange){range.location, range.length}]); 

E mi darà la stringa totale indietro, stackoverflow.html, ma sono interessato solo a ciò che è in (. *). Voglio tornare 'overflow'. In PHP questo è stato facile da fare, ma come puoi farlo in xCode per iOS?

Logicamente se farei questo:

NSInteger firstPartLength = 5; 
NSInteger secondPartLength = 5; 
NSLog (@"%@", [string substringWithRange:(NSRange){range.location + firstPartLength, range.length - (firstPartLength + secondPartLength)}] 

Mi dà il risultato propert 'overflow'. Ma il problema è che in molti casi non conosco la lunghezza della prima parte o della seconda parte. Quindi c'è un modo per ottenere il valore che dovrebbe essere in (. *)?

Oppure devo decidere di scegliere il metodo più brutto trovando la posizione di (. ) e calcolare la prima e la seconda parte da lì? Ma nell'espressione regolare si potrebbe anche avere ([a-z]) ma poi il modo brutto di usare un'altra espressione regolare per ottenere la posizione dei valori tra() e quindi usarlo per calcolare la parte sinistra e destra? E cosa succede se ne ho di più? come 'A (.) dovrebbe trovare la risposta a (. *).' Mi piacerebbe avere un array come risultato con valori [0] il valore dopo A e [1] il valore dopo a.

Spero che la mia domanda sia chiara.

Grazie in anticipo,

risposta

1

Volete biblioteca RegexKitLite al fine di eseguire le espressioni regolari partite:

http://regexkit.sourceforge.net/RegexKitLite/

Dopo che è quasi esattamente come lo si fa in PHP.

io aggiungo un po 'di codice per aiutarvi con esso:

NSString *string  = @"stackoverflow.html"; 
NSString *expression = @"stack(.*)\\.html"; 
NSString *matchedString = [string stringByMatching:expression capture:1]; 

matchedString è @ "troppo pieno", che dovrebbe essere esattamente quello che ti serve.

+3

penso NSRegularExpression più utile – SAKrisT

+0

Rispetto a Perl o Ruby o molte altre lingue, NSRegularExpression è potente, ma nei casi più comuni utilizza un paragrafo a che fare una pena vale la pena di lavoro. Mi piace come questo esempio di libreria possa farti abbinare un'espressione e catturare un gruppo in una riga ragionevole. –

91

in iOS 4.0+, è possibile utilizzare NSRegularExpression:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"stack(.*).html" options:0 error:NULL]; 
NSString *str = @"stackoverflow.html"; 
NSTextCheckingResult *match = [regex firstMatchInString:str options:0 range:NSMakeRange(0, [str length])]; 
// [match rangeAtIndex:1] gives the range of the group in parentheses 
// [str substringWithRange:[match rangeAtIndex:1]] gives the first captured group in this example 
Problemi correlati