regex - NSPredicar con una cadena que coincida con el comienzo de las palabras
nsfetchrequest swift 4 (1)
Esto debe ser un duplicado. Pero con tantas preguntas de NSPredicate, no puedo encontrar la correcta.
Tengo una lista de objetos de Datos principales que contienen un campo compositeName
. Un nombre como ''Emily Blunt'' podría estar allí. Quiero buscar en la lista usando un NSPredicate
que me permita buscar "Em" pero también para "Bl" y luego mostrar este nombre en los resultados obtenidos.
Esto debe ser súper fácil, pero como dirías, no lo estoy viendo. Mi intento disfuncional de una NSPredicate con una expresión regular se ve así:
[NSPredicate predicateWithFormat:@"compositeName MATCHES[cd] ''.*(?<=^|//s)%@.*''", query];
Mi pensamiento para esta expresión regular fue:
- cualquier cantidad de caracteres antes
- aspecto negativo detrás de espacios o comienzo
- la consulta
- cualquier número de personajes después
Pero no está funcionando. No estoy obteniendo ningún resultado. ¿Cómo puedo solucionar esto?
PD: si hay una solución de NSPredicate sin expresiones regulares que también se adapte a mi propósito.
Necesita construir toda la cadena de patrón de expresiones regulares fuera de la cadena de predicados, y luego pasarla al predicado.
Además, existe una construcción de expresiones regulares /b
para que coincida con un límite de palabras, que es lo que buscas.
Entonces, en conjunto, esto debería darle una solución simple a su problema:
NSString *searchString = @"Em";
NSString *regexString = [NSString stringWithFormat:@".*//b%@.*", searchString];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.compositeName matches[cd] %@", regexString];
Si el texto de búsqueda de entrada no se ha limpiado, es posible que desee hacerlo antes de pasarlo al motor de expresiones regulares.
Otra mejora podría ser aceptar caracteres Unicode en el límite de palabras para permitir a las personas buscar ''Ántonio'', ''Über'' y otras cadenas similares.
Las siguientes líneas de código crearán un patrón de expresiones regulares que se encargará de ambos aspectos:
NSString *orgSearchString = @"^";
NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString];
NSString *regexString = [NSString stringWithFormat:@"(?w:).*//b%@.*", escapedSearchString];