2009-05-10 9 views
10

¿Cuál es el mejor método para usar Expresiones regulares dentro de Objective-C?Solución Regex para Objective-C

Parece que hay algún proyecto de código abierto que proporciona regex compatible, ¿alguien puede recomendar uno?

También miré NSPredicate, ¿alguien puede sugerir cualquier regex ejemplos?

Antecedentes: Quiero utilizar expresiones regulares principalmente para la validación, IP, direcciones de correo electrónico, etc de ID interno

+1

duplicados de http://stackoverflow.com/questions/422138/regular-expressions-in-an-objective -c-cocoa-aplicación. Ejemplos de 'NSPredicate': http://stackoverflow.com/questions/2458881/nspredicate-and-regex, http://stackoverflow.com/questions/1582700/nspredicate-and-simple-regular-expression-problem. Si le preocupa principalmente la orientación del sistema operativo del iPhone, consulte http://stackoverflow.com/questions/444772/best-regex-library-for-iphone-sdk-app – outis

Respuesta

8

Por favor, lea la full post encima en http://cocoawithlove.com.

en Cocoa, funciona de NSPredicate la misma manera que el "dónde" cláusula de SQL. La razón principal de que NSPredicate está siendo llevado al iPhone es que NSPredicate cumple la misma función en de Datos Básicos que "WHERE" cláusulas cumplen en SQL - para permitir el almacenamiento persistente para ir a buscar objetos que satisfacen criterios específicos .

// given an NSDictionary created used the above method named "row"... 
NSPredicate *johnSmithPredicate = 
    [NSPredicate predicateWithFormat:@"firstname = 'John' AND lastname = 'Smith'"]; 
BOOL rowMatchesPredicate = [johnSmithPredicate evaluateWithObject:row]; 

verificar una dirección de correo electrónico

El "similares" operador de comparación en NSPredicate (NSLikePredicateOperatorType) es comúnmente usado como un medio conveniente de pruebas si un NSString coincide con una Regular Expression. Es una ventaja de en las bibliotecas completas con mayores opciones de y la capacidad de reemplazo es que ya está en Cocoa - no hay bibliotecas , no hay enlaces, no hay problemas.

Se puede hacer una prueba sencilla:

NSPredicate *regExPredicate = 
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regularExpressionString]; 
BOOL myStringMatchesRegEx = [regExPredicate evaluateWithObject:myString]; 

La única pregunta que queda es: lo que es una expresión regular que puede ser usado para verificar que un NSString contiene una sintácticamente válida correo electrónico dirección?

NSString *emailRegEx = 
    @"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}" 
    @"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" 
    @"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-" 
    @"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5" 
    @"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" 
    @"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" 
    @"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"; 
+0

Me di cuenta de que este monstruo regex funciona en el simulador de iPad, pero no en el hardware del iPad (a partir de la versión iOS 4.2). – caleb

1
+1

No lo he intentado pero parece ser exactamente lo correcto. (Tenga en cuenta el requisito de incluir un aviso de copyright en los programas distribuidos utilizando el marco.) –

2

tener una oportunidad con CSRegex: http://www.cocoadev.com/index.pl?CSRegex

Está destinado a ser una clase de expresiones regulares rápido y simple que se puede caer en cualquier proyecto de cacao con un mínimo de esfuerzo. Consiste en solo dos archivos y sin dependencias externas.

13
NSPredicate *predicate; 
predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES '.*@.*\..*'"]; 
BOOL result = [predicate evaluateWithObject:@"[email protected]"]; 

De acuerdo con los Predicate guide:

Partidos
La expresión de la izquierda es igual a la expresión de la derecha utilizando una comparación de estilo de expresiones regulares de acuerdo a v3 UCI (para más detalles, véase el ICU Guía del usuario para Regular Expressions).

Incluso hay un example written by Apple que se puede encontrar en la guía.

En lugar de SELF también puede usar un key path. (. Y posiblemente some other literals también)