2010-11-15 13 views
25

Recibí una cadena como 'stackoverflow.html' y en la expresión regular 'stack (. ) .html' Me gustaría tener el valor en (.).¿Cómo obtener coincidencias en iOS usando expresiones regulares?

sólo pude encontrar NSPredicate como:

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

Pero eso sólo dice que tengo un partido y no devuelve una cadena, cuando uso NSRegularExpression:

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

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

me dará la secuencia de regreso total, stackoverflow.html, pero solo estoy interesado en eso que está en (. *). Quiero recuperar el "exceso". En PHP esto fue fácil de hacer, pero ¿cómo se puede lograr esto en xCode para iOS?

Lógicamente si me gustaría hacer esto:

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

Me da el resultado propert 'desbordamiento'. Pero el problema es que en muchos casos no sé la duración de la primera parte o la segunda parte. Entonces, ¿hay alguna manera de obtener el valor que debería estar en (. *)?

¿O debo decidir elegir el método más feo encontrando la ubicación de (.) y calcular la primera y la segunda parte a partir de ahí? Pero en la expresión regular también puede tener ([a-z]) pero luego la forma fea de usar otra expresión regular para obtener la ubicación de los valores entre() y luego usar eso para calcular la parte izquierda y derecha. ¿Y qué pasa si tengo más? como 'A (.) debería encontrar la respuesta a (. *).' Me gustaría tener una matriz como resultado con valores [0] el valor después de A y [1] el valor después de para.

Espero que mi pregunta sea clara.

Gracias de antemano,

Respuesta

1

desea que el RegexKitLite biblioteca con el fin de llevar a cabo la expresión regular coincide:

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

Después de que es casi exactamente igual que lo hace en PHP.

voy a añadir algo de código para ayudarle con él:

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

matchedString es @ "desbordamiento", que debe ser exactamente lo que necesita.

+3

creo NSRegularExpression más útil – SAKrisT

+0

En comparación con Perl o Ruby o muchos otros idiomas, NSRegularExpression es potente, pero en los casos más comunes utiliza un párrafo que hacer una oración vale la pena de trabajo. Me gusta cómo este ejemplo de biblioteca puede permitirle emparejar una expresión y capturar un grupo en una línea razonable. –

91

en IOS 4.0 o superior, puede utilizar 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 
Cuestiones relacionadas