/ / Filtraggio dei percorsi dei file utilizzando NSPredicate - ios, regex, filtering, nspredicate

Filtraggio dei percorsi dei file usando NSPredicate - ios, regex, filtering, nspredicate

Sto cercando di filtrare un array di percorsi di file nel formato [numero] _ [numero] .png e ottieni solo quelli che iniziano con un numero specifico, ad esempio 1.

Questo è quello che ho provato:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"self MATCHES "%@/1_[0-9]+.png"",
[[[NSBundle mainBundle] resourcePath]
stringByAppendingPathComponent:@"Images"]];

NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png"
inDirectory:@"Images"]
filteredArrayUsingPredicate:predicate];

Ottengo un array vuoto. Ho provato a usare LIKE invece di MATCHES. Ho provato a usare i flag [cd] anche se non dovrebbe importare. Tuttavia ottengo sempre un array vuoto. È qualcosa con l'espressione regolare?


Modificare:

Sembra che il problema fosse con predicateWithFormat.

Ho pensato che ottenga una stringa di formato seguita dagli argomenti da sostituire nella stringa di formato. Non funziona in questo modo. Ignora gli argomenti e nulla viene sostituito nella stringa di formato.

Quindi la soluzione è la seguente:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
[NSString stringWithFormat:
@"self MATCHES "%@/1_[0-9]+.png"",
[[[NSBundle mainBundle] resourcePath]
stringByAppendingPathComponent:@"Images"]]];

NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png"
inDirectory:@"Images"]
filteredArrayUsingPredicate:predicate];

risposte:

0 per risposta № 1

Sembra che il problema sia un conflitto tra la prima e la seconda riga di codice. La prima riga imposta il tuo NSPredicate quindi è formattato in questo modo:

Images/1_#.png

Nella seconda riga, dici a iOS di cercare il tuo predicato all'interno del file Images directory. In questo modo, il tuo predicato / percorso finale sarà simile a questo:

Images/Images/1_#.png

Rimuovere la parte del file NSPredicate che aggiunge il Images/ directory all'inizio del predicato.

Tuttavia, il problema che ho descritto sopra potrebbe non essere il problema. Un altro possibile problema con il codice è che il formato del predicato non è corretto. Nel codice originale, dimentichi di aggiungere il file + dopo il 1 nel tuo NSPredicate (l'hai fatto dopo il [0-9] ma non il 1).

Il tuo codice dovrebbe apparire in questo modo:

NSString *filter = @"1+_[0-9]+.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"self MATCHES %@", filter];
NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png" inDirectory:@"Images"] filteredArrayUsingPredicate:predicate];

Quando provo il codice sopra nella mia applicazione, NSPredicate filtra con successo un NSString.

Potresti anche voler dare un'occhiata a questo link: http://useyourloaf.com/blog/2010/07/27/filtering-arrays-with-nspredicate.html