2012-06-17 22 views
8

Debe ser un duplicado. Pero con tantas preguntas de NSPredicate, no puedo encontrar la correcta.NSPedir con una cadena que coincida con el comienzo de las palabras

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 permitirá buscar "Em" pero también para "Bl" y luego mostrar este nombre en los resultados obtenidos.

Esto debe ser muy fácil, pero como supondría, no lo estoy viendo. Mi intento disfuncional a una NSPredicate con una expresión regular se ve así:

[NSPredicate predicateWithFormat:@"compositeName MATCHES[cd] '.*(?<=^|\\s)%@.*'", query]; 

mi pensamiento para esta expresión regular fueron:

  • cualquier número de caracteres antes de
  • espacios de búsqueda hacia atrás negativos o comenzar
  • la consulta
  • cualquier cantidad de caracteres después de

Pero no está funcionando. No estoy obteniendo ningún resultado. ¿Cómo puedo solucionar esto?

P.S. Si hay una solución NSPredicate sin expresiones regulares que también se adapte a mi propósito.

+0

posible duplicado de [ "Palabra completa" Buscar en un NSString través NSPredicate] (http: // stackoverflow. com/questions/8559156/búsqueda de palabra completa en-a-nsstring-through-nspredicate) – epologee

Respuesta

16

Necesita construir toda la cadena de patrón de expresiones regulares fuera de la cadena de predicados, y luego pasarla al predicado.

Además, hay una construcción regex \b para que coincida con un límite de palabras, que es lo que está buscando.

Así por completo, esto debería darle una solución sencilla 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 a que el 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 va a crear un patrón de expresión que se hará cargo de los dos aspectos:

NSString *orgSearchString = @"^"; 

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString]; 

NSString *regexString = [NSString stringWithFormat:@"(?w:).*\\b%@.*", escapedSearchString]; 
Cuestiones relacionadas