objective c - Expresiones regulares en una aplicación Objective-C Cocoa
regex (10)
La búsqueda inicial en Google indica que no hay una forma incorporada de hacer expresiones regulares en una aplicación Objective-C Cocoa.
Entonces cuatro preguntas:
¿Es eso realmente cierto?
¿Me estás tomando el pelo?
Ok, entonces ¿hay una buena biblioteca de código abierto que recomiendas?
¿Cuáles son las formas de acercarse lo suficiente sin importar una biblioteca, tal vez con la clase NSScanner?
- Sí, no hay soporte de expresiones regulares en Cocoa. Si solo está interesado en la concordancia booleana, puede usar NSPredicate que es compatible con la sintaxis de NSPredicate regulares de ICU. Pero normalmente le interesa la posición de la coincidencia o posición de las subexpresiones, y no puede obtenerla con NSPredicate.
- Como se mencionó, puede usar las funciones POSIX de expresiones regulares . Pero se consideran lentos, y la sintaxis de expresiones regulares es limitada en comparación con otras soluciones (ICU / pcre ).
- Hay muchas bibliotecas OSS, CocoaDev tiene una lista extensa .
RegExKitLite por ejemplo, no requiere ninguna biblioteca, solo agrega .m y .h a tu proyecto.
(Mi queja contra RegExKitLite es que amplía NSString por categoría, pero también se puede considerar como una función. También usa las bibliotecas de ICU no públicas que se incluyen con el SO, que Apple no recomienda).
Durante mi búsqueda sobre este tema, me encontré con CocoaOniguruma que usa Oniguruma , el motor de expresión regular detrás de Ruby1.9 y PHP5. Parece un poco más nuevo en comparación con el OregKit existente (en japonés). No estoy seguro de cómo se comparan con otras vinculaciones.
Google buscando un poco, encontró esta biblioteca: RegexOnNSString
Biblioteca de código abierto, que contiene funciones como:
-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase
y usando la clase NSRegularExpression
. Bastante fácil de usar y sin necesidad de preocuparse por nada.
Tenga en cuenta que NSRegularExpression
está disponible desde Mac OS X v10.7 e IOS 4.0, como se menciona en Datasmid.
La solución de hack barata y sucia que uso para resolver problemas de análisis REGEX y JSON es crear un objeto UIWebView e inyectar funciones de Javascript para realizar el análisis sintáctico. La función javascript devuelve una cadena del valor (o lista de valores) que me importa. De hecho, puede almacenar un pequeño conjunto de funciones personalizadas para tareas particulares y luego simplemente llamarlas según sea necesario.
No sé si esta técnica se adapta a grandes volúmenes de solicitudes de análisis repetidos, pero para tareas transaccionales rápidas hace el trabajo sin depender de ningún recurso o código externo adicional que pueda no entender.
Lo hago fácil Agrego un nuevo archivo de C ++ a mi proyecto de Objective C, lo cambio de nombre como .mm y luego creo una clase de C ++ estándar dentro. Luego, hago un método de clase estático en la sección "público:" para una función de C ++ que toma un NSString y devuelve un NSString (o NSArray, si eso es lo que quiere). Luego, convierto NSString en C ++ std :: string así:
// If anyone knows a more efficient way, let me know in the comments.
// The "if" condition below is because ObjC crashes if converting to
// std::string if the string is nil or empty.
// assume #include <string>
std::string s = "";
if (([sInput != nil]) && (!([sInput isEqualTo:@""]))) {
std::string sTemp([sInput UTF8String]);
s = sTemp;
}
A partir de ahí, puedo usar regex_replace así:
// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);
Entonces, puedo convertir esa std :: string nuevamente en un NSString con:
NSString *sResponse2 = @(sResult.c_str());
Si solo está usando este C ++ solo para esta función, entonces puede encontrar que es adecuado llamar a este archivo extra.mm (nombre de clase Extra) y poner este método de clase estática, y luego agregar otros métodos de clase estáticos cuando llegue la situación donde tiene sentido hacerlo en C ++ porque es menos complicado en algunos casos. (Hay casos en que ObjC hace algo con menos líneas de código, y en algunos casos donde C ++ lo hace con menos líneas de código).
PD. Otra forma más con esto es utilizar un archivo .mm pero crear un contenedor Objective C sobre el uso de std :: string y std :: regex_replace () (o regex_match ()).
Me gusta el marco AGRegex que usa PCRE, útil si está acostumbrado a la sintaxis PCRE. La mejor versión de este marco es la del cliente IRC de Colloquy, ya que se actualizó para usar PCRE 6.7:
http://colloquy.info/project/browser/trunk/Frameworks/AGRegex
Es muy ligero, mucho más que RegExKit (aunque no tan capaz, por supuesto).
Noté que a partir de iOS 4.0, Apple proporciona una clase NSRegularExpression . Además, a partir del 10.7, la clase está disponible bajo OS X.
Puede usar la biblioteca POSIX Regular Expressions (Yay para un SO compatible con POSIX). Tratar
man 3 regex
RegexKit es lo mejor que he encontrado hasta ahora. Muy Cocoa: y. Estoy usando la versión "Lite" en varias de nuestras aplicaciones para iPhone:
NSRegularExpression
está disponible desde Mac OS X v10.7 e IOS 4.0.